我试图在c++中用创建类似于cmd的cmd,我的一个函数应该通过输入"skype.exe“启动一个类似于open的进程。我在网上搜索,找到了应该为我做这项工作的CreateProcess函数。当我创建一个函数,接收我创建的名为Line的类值(类的名称,但它实际上并不是元函数),并以如下方式使用CreateProcess函数时,我必须输入cmd "start skype.exe“,但是我希望通过只编写"skype.exe”来实现它在常规cmd中的工作方式,我怎么做呢?( l.parameter只是一个包含skype这个词的字符串)
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, NULL, FALSE, 0, NULL, NULL, &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);}发布于 2016-04-20 20:25:14
首先是:
LPSTR s = const_cast<char *>(l.parameter.c_str());是个坏主意,CreateFile接受lpCommandLine非const缓冲区是有原因的-它可能会修改它:
系统将终止空字符添加到命令行字符串中,以将文件名与参数分隔开来。这将原始字符串分成两个字符串进行内部处理。
因此,您应该传递一个数组,例如:
TCHAR szCmd[MAX_PATH] = {0};那么,对于您的问题,如果"start skype.exe“对您有效,并且希望只在命令行输入skype.exe,那么为什么不将字符串连接起来呢?例如:
_tcscat(szCmd, _T("start "));
_tcscat(szCmd, parameter.c_str());并将szCmd传递给CreateProcess
问题是您是否使用UNICODE构建,如果是,那么确保参数是std::wstring,否则如果使用非UNICODE构建(看起来是这样的),那么std::string就可以了。
发布于 2016-04-20 22:30:18
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()将无法找到它,因为CreateProcess()不会在注册表的App Paths键中注册其.exe文件路径,也不会在系统的%PATH%环境变量上注册到Phone子文件夹( skype.exe所在的位置)的路径。
例如:
Line l;
line.parameter = "C:\\Program Files (x86)\\Skype\\Phone\\Skype.exe";
execute(l);幸运的是,Skype确实将skype.exe的完整路径存储在注册表中,特别是在以下键中:
HKEY_CURRENT_USER\Software\Skype\Phone它存储在一个名为REG_SZ的"SkypePath"值中。
std::string GetSkypePath()
{
std::string sPath;
HKEY hKey;
if (RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Skype\\Phone", 0, KEY_QUERY_VALUE, &hKey) == 0)
{
char szPath[MAX_PATH+1] = {0};
DWORD dwPathLen = MAX_PATH;
if (RegQueryValueExA(hKey, "SkypePath", NULL, NULL, (LPBYTE)szPath, &dwPathLen) == 0)
sPath = szPath;
RegCloseKey(hKey);
}
return sPath;
}https://stackoverflow.com/questions/36754174
复制相似问题