你好我想用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";
}
提前致谢
答案 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。