一段用到了CreateProcess的程序,其中第二个参数的内容是D:\xxxxx xxxxx\init.exe,运行,然后GetLastError是1812
这个程序编译后放在了D:\xxxxx xxxxx\下,于是手动将第二个参数改成PChar('init.exe');然后直接Runtime Error
求解
procedure TForm1.Button4Click(Sender: TObject);
var
TimeLimit: longint;
TStringsTemp: TStrings;
hWrite: THandle;
siStartupinfo: TStartupInfo;
piProcessinfo: TProcessInformation;
dRet: Boolean;
begin
TStringsTemp := TStringList.Create; CreateDirectory(PChar('Temp'), Nil);
TimeLimit := StrToInt(Form1.Edit4.Text);
Form1.Memo1.Lines := TStringsTemp; FillChar(siStartupinfo, Sizeof(siStartupInfo), #0);
GetStartupInfo(siStartupInfo);
hWrite := CreateFile(PChar('Temp\Input.txt'), GENERIC_WRITE, 0, Nil,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
with siStartupInfo do
begin
cb := SizeOf(siStartupInfo);
wShowWindow := SW_HIDE;
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
hStdOutput := hWrite;
end; dRet := CreateProcess(nil, PChar('"'+Form1.Edit3.Text+'"'), nil, nil, true,
NORMAL_PRIORITY_CLASS, nil, nil, siStartupinfo, piProcessinfo);
Messagebox(0, PChar(IntToStr(GetLastError)), '', 0);
//WaitForSingleObject(piProcessinfo)
//RemoveDirectory(PChar('Temp'));
end;
这个程序编译后放在了D:\xxxxx xxxxx\下,于是手动将第二个参数改成PChar('init.exe');然后直接Runtime Error
求解
procedure TForm1.Button4Click(Sender: TObject);
var
TimeLimit: longint;
TStringsTemp: TStrings;
hWrite: THandle;
siStartupinfo: TStartupInfo;
piProcessinfo: TProcessInformation;
dRet: Boolean;
begin
TStringsTemp := TStringList.Create; CreateDirectory(PChar('Temp'), Nil);
TimeLimit := StrToInt(Form1.Edit4.Text);
Form1.Memo1.Lines := TStringsTemp; FillChar(siStartupinfo, Sizeof(siStartupInfo), #0);
GetStartupInfo(siStartupInfo);
hWrite := CreateFile(PChar('Temp\Input.txt'), GENERIC_WRITE, 0, Nil,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
with siStartupInfo do
begin
cb := SizeOf(siStartupInfo);
wShowWindow := SW_HIDE;
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
hStdOutput := hWrite;
end; dRet := CreateProcess(nil, PChar('"'+Form1.Edit3.Text+'"'), nil, nil, true,
NORMAL_PRIORITY_CLASS, nil, nil, siStartupinfo, piProcessinfo);
Messagebox(0, PChar(IntToStr(GetLastError)), '', 0);
//WaitForSingleObject(piProcessinfo)
//RemoveDirectory(PChar('Temp'));
end;
我改成 C:\init.exe也报错了1812
是不是你的exe运行时要用到的其它的资源文件,但找不到