创建进程时出错

时间:2010-03-29 22:10:13

标签: c++ windows

你好我想用WIN32进行编程,因此我编写了一个程序来创建一个进程,但在代码行中,我创建了一个程序,程序得到一个错误,不能正常工作(abend)。我不知道程序1中的代码是错误的还是第二个程序中的代码应该由第一个程序创建。 (我不知道“createprocess”之后的第一个程序中的代码是否正确,因为我没有进一步调试,因为在这行中我得到了错误。(我测试了它没有cout,waitforobject和关闭句柄但我也没有工作))。

第一个程序:

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

using namespace std;

void main()
{

bool ret;
bool retwait;

STARTUPINFO startupinfo;
GetStartupInfo (&startupinfo);

PROCESS_INFORMATION pro2info;

    ret = CreateProcess(NULL, L"D:\\betriebssystemePRA1PRO2.exe", NULL, NULL, false, CREATE_NEW_CONSOLE, NULL,
        NULL, &startupinfo, &pro2info);


    cout<<"hProcess: "<<pro2info.hProcess<<endl;
    cout<<"dwProcessId: "<<pro2info.dwProcessId <<endl;

    retwait= WaitForSingleObject (pro2info.hProcess, 100);
    retwait= WaitForSingleObject (pro2info.hProcess, 100);

    CloseHandle (pro2info.hProcess);//prozesshandle schließen 

    retwait= WaitForSingleObject (pro2info.hProcess, 100);



ExitProcess(0);


} 

Seconde Programm:

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

using namespace std;

void main()
{


    int b;

    b=GetCurrentProcessId();

    cout<<b<<endl;
    cout<<"Druecken Sie Enter zum Beenden"<<endl;
    cin.get();
        //warten bis Benutzer bestätigt

    Sleep (700);
    ExitProcess(0);

    cout<<"test";
}

提前致谢

2 个答案:

答案 0 :(得分:4)

请注意lpCommandLine CreateProcess参数的类型 - 它是LPTSTR,而不是LPCTSTR,即不是 {{ 1}}。

这意味着 const保留实际修改 CreateProcess内容的权利。但是,您提供了一个指向字符串文字的指针作为参数,字符串文字是不可变的(它们来自程序的只读数据段,尝试更改它们通常会导致访问冲突错误。)

要解决此问题,只需更改您的代码not to use an immutable string literal

lpCommandLine

有趣的是,wchar_t wcsCommandLine[] = L"D:\\betriebssystemePRA1PRO2.exe"; ret = CreateProcess(NULL, wcsCommandLine, NULL, NULL, ... (UNICODE)尝试写入CreateProcessW,而lpCommandLine(ANSI)没有,并且意外 - 您的第一个程序是作为UNICODE构建的(如果你是将其构建为ANSI,它可以开箱即用,至少在Windows XP上。)

我可以确认,通过上述修改,您的代码可以正常运行。

另请注意:

  • 除非您需要指定CreateProcessA的窗口标题,位置等,否则根本不需要提供D:\\betriebssystemePRA1PRO2.exe结构,您只需传递{{ 1}}为STARTUPINFO,将使用默认值
  • 你不应该在关闭的句柄上调用lpStartupInfo

答案 1 :(得分:3)

您必须设置startupinfo结构的大小:

startupinfo.cb = sizeof(startupinfo);

也许这就是CreateProcess失败的原因。

顺便说一下 - 你为什么打电话给GetStartupInfo?您应该将startupinfo的内存清零(除了如上所述设置大小)。

查看示例here