
我正在尝试创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函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)