C ++ - CreateProcess失败代码2

时间:2018-03-16 12:27:12

标签: c++ winapi process exe

我正在尝试使用CreateProcess()函数来启动位于我的根目录(我的VS解决方案所在的目录)中的文件夹中的.exe应用程序。好像很简单吧?它可能是但我不能为我的生活注意到我做错了什么。每次我尝试启动.exe时,都会收到错误消息“CreateProcess failed code 2”,这意味着我找不到我尝试启动的.exe文件。

我的代码:

void HavNetProfiler::LaunchClumsy()
{
  STARTUPINFO si;
  PROCESS_INFORMATION pi;

  ZeroMemory(&si, sizeof(si));
  si.cb = sizeof(si);
  ZeroMemory(&pi, sizeof(pi));

  // Start the child process. 
  if (!CreateProcess((LPCTSTR)"Clumsy\\clumsy.exe",   // No module name (use command line)
    NULL,        // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    0,              // No creation flags
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory 
    &si,            // Pointer to STARTUPINFO structure
    &pi)           // Pointer to PROCESS_INFORMATION structure
    )
  {
    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);
}

我使用此功能错了吗?我误解了它是如何工作的还是我错过了一些细节?我在一个放在不同文件夹中的文件中调用函数LaunchClumsy()(该文件夹存在于根文件夹中,就像“Clumsy”文件夹一样)。这会有所作为吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

代码中有2个直接错误:

  1. LPCTSTR演员表错了。如果您的代码在没有该强制转换的情况下无法编译,则表明您使用了错误的字符编码传递了参数将其更改为L"Clumsy\\clumsy.exe"以显式传递宽字符字符串。
  2. 使用相对路径很可能会失败。系统从当前工作目录开始搜索。这是一个进程范围的属性,可以随时由任何线程更改。改为使用绝对路径。