使用CreateProcess函数

使用CreateProcess函数,第1张

概述使用CreateProcess函数

我正在尝试创build一个类似于cmd与Microsoft Visual Studio Express 2013 for windows桌面在c + +中,我的一个函数应该启动一个类似于打开skype通过键入“skype.exe”的过程。 我在网上search,发现CreateProcess函数应该为我做的工作。 当我创build一个接收一个我创build的类名为line(类的名称,但它并不真正metter)的类的函数并使用下面显示的方式使用CreateProcess函数时,我必须input我的cmd“start skype.exe“,但我希望它能像在普通的cmd中一样只写”skype.exe“,我该怎么办呢? (l.parameter只是一个包含单词skype的string)

voID execute(line l){ STARTUPINFO si; PROCESS_informatION pi; ZeroMemory(&si,sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi,sizeof(pi)); LPSTR s = const_cast<char *>(l.parameter.c_str()); if (!CreateProcess(NulL,s,NulL,FALSE,&si,&pi)) { printf("CreateProcess Failed (%d).n",GetLastError()); return; } // Wait until child process exits. WaitForSingleObject(pi.hProcess,INFINITE); // Close process and thread handles. CloseHandle(pi.hProcess); CloseHandle(pi.hThread);}

c ++ mingw STL安装

开箱即用的PDT(PHP开发工具)不能deBUGgingPHP,为什么?

.NET windows服务在ntdll.dll中崩溃

windows *** 作系统和内存pipe理 – 应用程序最小化时会发生什么?

通过使用指向创build对象的指针访问冲突错误

首先是:

LPSTR s = const_cast<char *>(l.parameter.c_str());

是不好的主意, Createfile接受lpCommandline非const缓冲区的原因 – 它可能会修改它:

系统向命令行字符串添加一个终止空字符,以将文件名与参数分开。 这将原始字符串分成两个字符串进行内部处理。

所以你应该传递一个数组,例如:

TCHAR szCmd[MAX_PATH] = {0};

那么到你的问题,如果“启动skype.exe”适用于你,你想只在命令行输入skype.exe – 那么为什么不串联字符串? 例如:

_tcscat(szCmd,_T("start ")); _tcscat(szCmd,parameter.c_str());

并将szCmd传递给CreateProcess

问题是你是否使用UNICODE构建,如果是的话确保参数是std :: wstring,否则,如果你使用非UNICODE构建(它看起来像是true),那么std :: string是好的。

start不是可执行文件,它是cmd.exe一个功能,所以要通过CreateProcess()调用start skype.exe ,必须指定cmd.exe作为命令,并以/C start skype.exe作为其参数。

line l; line.parameter = "cmd.exe /C start skype.exe"; execute(l);

但是,在这种情况下,这是过度的,因为尽管你声称自己有什么要求,但实际上并不需要start 。 这是完全有效的,最好直接调用skype.exe作为命令。

但是,您必须提供skype.exe的完整路径 (如果您要调用start ,则是相同的),否则CreateProcess()将无法找到它,因为Skype没有在App Paths注册它的.exe文件App Paths注册表的关键字,或其Phone子文件夹(其中位于skype.exe所在的位置)的%PATH%在系统的%PATH%环境变量上。

例如:

line l; line.parameter = "C:\Program files (x86)\Skype\Phone\Skype.exe"; execute(l);

幸运的是,Skype确实在注册表中存储了完整的skype.exe路径,具体如下:

HKEY_CURRENT_USERSoftwareSkypePhone

它存储在名为"SkypePath"的REG_SZ值中。

std::string GetSkypePath() { std::string sPath; HKEY hKey; if (RegOpenKeyExA(HKEY_CURRENT_USER,"Software\Skype\Phone",KEY_query_VALUE,&hKey) == 0) { char szPath[MAX_PATH+1] = {0}; DWORD DWPathLen = MAX_PATH; if (RegqueryValueExA(hKey,"SkypePath",(LPBYTE)szPath,&DWPathLen) == 0) sPath = szPath; RegCloseKey(hKey); } return sPath; }

总结

以上是内存溢出为你收集整理的使用CreateProcess函数全部内容,希望文章能够帮你解决使用CreateProcess函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1157994.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-01
下一篇2022-06-01

发表评论

登录后才能评论

评论列表(0条)

    保存