2013-05-12 303 views
0

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

#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); 

有什么区别?

+0

你的测试有点奇怪。如果成功,'CreateProcess'返回一个非零值,所以你最好放松'== TRUE'。 – ChrisF 2013-05-12 11:38:00

+0

你怎么知道它失败?你没有测试返回值。 – paulm 2013-05-12 11:47:34

+0

@paulm首先,notepad.exe没有执行,第二,getlasteeror返回代码错误3,我做错了什么? – Robert 2013-05-12 11:53:49

回答

1

尝试从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); 
+0

谢谢,它的作品也是 – Robert 2013-05-12 12:04:25

2

这是well documented on MSDN,如果你仔细阅读这个代码:

第一个参数lpApplicationName

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

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

您不希望将模块名称放入第一个参数中,无论出于何种原因。如果你通过NULL作为参数,这是可以的。

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

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

+0

是的,你是对的,谢谢你 – Robert 2013-05-12 13:28:25