ShellExecute(handle, 'print', PChar(ObjectFileName), nil, nil, SW_HIDE); 와 같이 사용하고 있습니다. 그런데...
shellExecute문 다음 문장에서 ShellExecute문의 결과로 나온 것을 사용합니다. 이 때문에... 원하는 결과가 나오지 않습니다. .
--> ShellExecute문의 실행이 완전히 끝난후에 다음 문장들을 실행하려고 할 때 어떻게 해야합니까.. 알려주십시요.. please..
프로그램을 만들다가 보면 외부프로그램을 실행시켜주고 그 프로그램이 끝난후에 계속 진행이 되도록 하고 싶은 경우가 생길것이다.
16비트에서는 실행시키고 그냥 반복문으로 그 프로그램의 핸들이 없어질때까지 루프를 돌면 되지만 32비트에서는 그방법이 통하지 않는다. 쓰레드라는 놈때문에...
이 함수를 쓰면 간단히 해결할 수 있다.
function TMainForm.AsyncShell(FilePath, CmdLine:string) : Boolean;
var
StartInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
bCreatedOk : Boolean;
IsTerminated : Integer;
begin
FillChar( StartInfo, Sizeof(TStartupInfo), #0);
FillChar( ProcessInfo, Sizeof(TProcessInformation), #0);
StartInfo.cb := sizeof(StartInfo);
StartInfo.dwFlags := STARTF_USESTDHANDLES + STARTF_FORCEONFEEDBACK;
// 매개변수가 있을 경우와 없을 경우를 달리호출한다.
if CmdLine <> '' then
bCreatedOk := CreateProcess(PChar(FilePath), PChar(CmdLine),
nil, nil, false,
DETACHED_PROCESS + HIGH_PRIORITY_CLASS,
nil, nil, StartInfo, ProcessInfo )
else
bCreatedOk := CreateProcess(nil, PChar(FilePath),
nil, nil, false,
DETACHED_PROCESS + HIGH_PRIORITY_CLASS,
nil, nil, StartInfo, ProcessInfo );
if bCreatedOk then begin
while True do begin
GetExitCodeProcess(ProcessInfo.hProcess, IsTerminated);
if (IsTerminated = 0) or (IsTerminated = 1) then Break;
Application.ProcessMessages;
end;
end;
CloseHandle(ProcessInfo.hProcess);
Result := True;
end;
여용구 wrote:
> ShellExecute(handle, 'print', PChar(ObjectFileName), nil, nil, SW_HIDE); 와 같이 사용하고 있습니다. 그런데...
> shellExecute문 다음 문장에서 ShellExecute문의 결과로 나온 것을 사용합니다. 이 때문에... 원하는 결과가 나오지 않습니다. .
>
> --> ShellExecute문의 실행이 완전히 끝난후에 다음 문장들을 실행하려고 할 때 어떻게 해야합니까.. 알려주십시요.. please..
>