Q&A

  • ShellExecute 사용시 문제..
ShellExecute(handle, 'print', PChar(ObjectFileName), nil, nil, SW_HIDE); 와 같이 사용하고 있습니다. 그런데...

shellExecute문 다음 문장에서 ShellExecute문의 결과로 나온 것을 사용합니다. 이 때문에... 원하는 결과가 나오지 않습니다. .



--> ShellExecute문의 실행이 완전히 끝난후에 다음 문장들을 실행하려고 할 때 어떻게 해야합니까.. 알려주십시요.. please..



3  COMMENTS
  • Profile
    이정욱 1999.11.11 04:17
    한델의 팁모아에서 가져왔습니다... 미리 검색해 보시지...



    프로그램을 만들다가 보면 외부프로그램을 실행시켜주고 그 프로그램이 끝난후에 계속 진행이 되도록 하고 싶은 경우가 생길것이다.

    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..

    >

  • Profile
    rika 2000.07.22 01:27
    좀 고쳐봤습니다. 버그수정



    이정욱 wrote:

    > 한델의 팁모아에서 가져왔습니다... 미리 검색해 보시지...

    >

    > 프로그램을 만들다가 보면 외부프로그램을 실행시켜주고 그 프로그램이 끝난후에 계속 진행이 되도록 하고 싶은 경우가 생길것이다.

    > 16비트에서는 실행시키고 그냥 반복문으로 그 프로그램의 핸들이 없어질때까지 루프를 돌면 되지만 32비트에서는 그방법이 통하지 않는다. 쓰레드라는 놈때문에...

    > 이 함수를 쓰면 간단히 해결할 수 있다.



    > function TMainForm.AsyncShell(FilePath, CmdLine:string) : Boolean;

    > var

    > StartInfo : TStartupInfo;

    > ProcessInfo : TProcessInformation;

    > bCreatedOk : Boolean;

    > IsTerminated : Integer;

    command : PChar;

    > begin

    > FillChar( StartInfo, Sizeof(TStartupInfo), #0);

    > FillChar( ProcessInfo, Sizeof(TProcessInformation), #0);

    >

    > StartInfo.cb := sizeof(StartInfo);

    > StartInfo.dwFlags := STARTF_USESTDHANDLES + STARTF_FORCEONFEEDBACK;

    >

    > // 매개변수가 있을 경우와 없을 경우를 달리호출한다.



    // 매개변수 영향이 없다.

    CmdLine := FilePath + ' ' + CmdLine;

    command := PChar(CmdLine);



    bCreatedOk := CreateProcess(PChar(FilePath), PChar(CmdLine),

    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;

    // disable code 추가(아마도)

    > end;

    > end;

    > CloseHandle(ProcessInfo.hProcess);

    // enable code 추가(아마도)

    >

    > Result := True;

    > end;

    >

    >

    > 여용구 wrote:

    > > ShellExecute(handle, 'print', PChar(ObjectFileName), nil, nil, SW_HIDE); 와 같이 사용하고 있습니다. 그런데...

    > > shellExecute문 다음 문장에서 ShellExecute문의 결과로 나온 것을 사용합니다. 이 때문에... 원하는 결과가 나오지 않습니다. .

    > >

    > > --> ShellExecute문의 실행이 완전히 끝난후에 다음 문장들을 실행하려고 할 때 어떻게 해야합니까.. 알려주십시요.. please..

    > >

  • Profile
    여용구 1999.11.12 18:30
    답변 감사합니다..

    제가 잘 몰라서 그러는데.. ShellExecute(handle, 'print', PChar(ObjectFileName), nil, nil, SW_HIDE); 문을 AsyncShell(FilePath, CmdLine:string) 를 사용하여 적용하려면 어떻게 해야할지 알려주십시요..









    이정욱 wrote:

    > 한델의 팁모아에서 가져왔습니다... 미리 검색해 보시지...

    >

    > 프로그램을 만들다가 보면 외부프로그램을 실행시켜주고 그 프로그램이 끝난후에 계속 진행이 되도록 하고 싶은 경우가 생길것이다.

    > 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..

    > >