【问题标题】:CreateProcess,winapi,error code 3CreateProcess,winapi,错误代码3
【发布时间】:2013-05-12 11:33:36
【问题描述】:

这是我的代码。我总是收到错误 3,我该怎么办?我尝试用 CreateProcessA 替换 CreateProcces,替换前两个参数,尝试处理其他程序,但它仍然不起作用。谢谢。

  #include "windows.h"
  #include <iostream>

  void main() {

     STARTUPINFOA cif;
     ZeroMemory(&cif,sizeof(cif));
     PROCESS_INFORMATION pi;
     CreateProcessA("","C:\\Windows\\notepad.exe",NULL,NULL, NULL,NULL,NULL,NULL,&cif,&pi);

     DWORD error=GetLastError();
     std::cout << "error " << error << "\n";
     while(1) {}        // подождать
 }

是的,你是对的。我已经更正了它,但它仍然返回错误代码 3。 一是notepad.exe没有执行,二是getlasteeror返回代码错误3,我做错了什么?

我放置:

      char* path="C:\\Windows\\notepad.exe";
      CreateProcessA(path,"sfvfd",NULL,NULL,NULL,NULL,NULL,NULL,&cif,&pi);

而不是(并且有效!):

      CreateProcessA("","C:\\Windows\\notepad.exe",NULL,NULL,            
      NULL,NULL,NULL,NULL,&cif,&pi);

有什么区别?

【问题讨论】:

  • 你的 if 测试有点奇怪。 CreateProcess 如果成功则返回一个非零值,因此最好不要使用 ==TRUE
  • 你怎么知道它失败了?你不是在测试返回值。
  • @paulm 第一,notepad.exe没有执行,第二,getlasteeror返回代码错误3,我做错了什么?
  • 如果没有失败则GetLastError的值没有意义

标签: winapi createprocess


【解决方案1】:

well documented on MSDN,如果你仔细阅读:

第一个参数lpApplicationName

要执行的模块的名称。 [...]

lpApplicationName 参数可以为 NULL。在这种情况下,模块名称必须是 lpCommandLine 字符串中第一个以空格分隔的标记。 [...]

无论出于何种原因,您都不想将要执行的模块名称放入第一个参数中。如果您随后将 NULL 作为参数传递,则可以。

但是,您将非NULL 指针传递给空字符串。所以 API 不会选择你的记事本路径,而是尝试运行一个空字符串。

Nence, 3 = ERROR_PATH_NOT_FOUND "系统找不到指定的路径。"

【讨论】:

    【解决方案2】:

    从 MSDN 示例中尝试此代码

    #include <windows.h>
    #include <stdio.h>
    
    
    void main()
    {  
      STARTUPINFOA si;
      PROCESS_INFORMATION pi;
    
      ZeroMemory( &si, sizeof(si) );
      si.cb = sizeof(si);
      ZeroMemory( &pi, sizeof(pi) );
    
      // Start the child process. 
      if(!CreateProcessA( NULL,     // No module name (use command line)
        "C:\\Windows\\notepad.exe", // 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 );
    

    【讨论】:

      猜你喜欢
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 2014-02-26
      • 1970-01-01
      相关资源
      最近更新 更多