Delphi MsgWaitForMultipleObjects返回的访问被拒绝
我有以下创建流程的函数:Delphi MsgWaitForMultipleObjects返回的访问被拒绝,delphi,winapi,wait,Delphi,Winapi,Wait,我有以下创建流程的函数: function .CreateProcess(aAppletPath: string; var aError : string; aProcessInfo: TProcessInformation): Boolean; var StartInfo: TStartupInfo; begin FillChar(StartInfo, SizeOf(TStartupInfo),#0); FillChar(aProcessInfo, SizeOf(TProcessI
function .CreateProcess(aAppletPath: string; var aError : string; aProcessInfo: TProcessInformation): Boolean;
var
StartInfo: TStartupInfo;
begin
FillChar(StartInfo, SizeOf(TStartupInfo),#0);
FillChar(aProcessInfo, SizeOf(TProcessInformation),#0);
StartInfo.cb := SizeOf(TStartupInfo);
if False then begin
StartInfo.dwFlags := STARTF_USESHOWWINDOW;
StartInfo.wShowWindow := SW_HIDE;
end;
if Windows.CreateProcess(nil, PChar(aAppletPath), nil, nil, False, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, nil, StartInfo, aProcessInfo) then begin
Result := True;
WaitForInputIdle(aProcessInfo.hProcess, oTimeOutSecs * 1000);
end
else begin
Result := False;
end;
end;
我有一个等待应用程序终止的方法:
function WaitForProcessTerminate(aHandle: THandle) : Boolean;
var
vResult : LongWord;
Msg: TMsg;
PHandles: Pointer;
begin
vResult := 0;
PHandles := @aHandle;
PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE);
while True do begin
vResult := Windows.MsgWaitForMultipleObjects(1, PHandles^, False, oTimeOutSecs * 1000, QS_ALLINPUT);
if vResult = WAIT_OBJECT_0 + 1 then begin
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end
else begin
Break;
end;
end;
case vResult of
WAIT_ABANDONED: Result := False;
WAIT_OBJECT_0: Result := True;
WAIT_TIMEOUT: Result := False;
else begin
Result := False;
end;
end;
if not Result then begin
ShowMessage(SystemErrorMessage);
end;
end;
问题是等待函数总是返回
wait\u FAILED
,并显示访问被拒绝
消息。我做错了什么?这段代码是Delphi 2010,我调用的应用程序是java应用程序。Nevermind伙计们。这是我的错误。职能:
function .CreateProcess(aAppletPath: string; var aError : string; aProcessInfo: TProcessInformation): Boolean;
应该是:
function .CreateProcess(aAppletPath: string; var aError : string; var {should be var!!} aProcessInfo: TProcessInformation): Boolean;
抱歉。伙计们,别客气。这是我的错误。职能:
function .CreateProcess(aAppletPath: string; var aError : string; aProcessInfo: TProcessInformation): Boolean;
应该是:
function .CreateProcess(aAppletPath: string; var aError : string; var {should be var!!} aProcessInfo: TProcessInformation): Boolean;
很抱歉。更好的方法是,使用
out
向调用者指示他们在调用函数之前不需要分配任何内容。更好的方法是,使用out
向调用者指示他们在调用函数之前不需要分配任何内容。请调用UniqueString(aAppletPath)
在调用CreateProcess
之前;允许API修改您传递给它的字符串,因此您应该确保调用者没有得到修改后的值作为回报。请在调用CreateProcess
之前调用UniqueString(aAppletPath)
;允许API修改传递给它的字符串,因此您应该确保调用者也不会得到修改后的值作为回报。