Q&A

  • 다른 프로그램 종료시점 알아내기
도움을 구합니다.



WINEXEC 또는 ShellExecute 를 이용하여 도스명령어나 다른 실행파일을

실행한후 해당작업 완료라는 메세지를 띄우고 싶은데



제가 따로 실행시킨 프로그램의 끝나는 시점을 알고 싶습니다.

여러 고수님의 답변 부탁합니다.





2  COMMENTS
  • Profile
    구창민 2000.03.21 01:46
    blueSky wrote:

    > 도움을 구합니다.

    >

    > WINEXEC 또는 ShellExecute 를 이용하여 도스명령어나 다른 실행파일을

    > 실행한후 해당작업 완료라는 메세지를 띄우고 싶은데

    >

    > 제가 따로 실행시킨 프로그램의 끝나는 시점을 알고 싶습니다.

    > 여러 고수님의 답변 부탁합니다.

    >

    >



    안녕하세요~ 구창민입니다.

    아래는 함수는 32비트 체제에서 프로그램을 실행시키고 끝날때 까지

    기다리다 끝나는 시점을 알아내는 예제입니다.

    일전에 제가 테스트를 거친내용이므로 그냥 사용하셔도 될겁니다.

    그럼 ~ 즐거운 프로그래밍 하세요~





    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls, ShellApi;



    type

    TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation



    {$R *.DFM}

    function WinExecAndWait32(FileName : PChar; CommandLine : PChar;

    Visibility : Integer) : Integer;

    var

    zAppName:array[0..512] of char;

    zCurDir:array[0..255] of char;

    WorkDir:ShortString;

    StartupInfo:TStartupInfo;

    ProcessInfo:TProcessInformation;

    begin

    StrCopy(zAppName, FileName);

    StrCat(zAppName, CommandLine);

    GetDir(0, WorkDir);

    StrPCopy(zCurDir, WorkDir);

    FillChar(StartupInfo, Sizeof(StartupInfo),#0);

    StartupInfo.cb := Sizeof(StartupInfo);

    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;

    StartupInfo.wShowWindow := Visibility;

    if not CreateProcess(nil,

    zAppName, { pointer to command line string }

    nil, { pointer to process security attributes}

    nil, { pointer to thread security attributes }

    false, { handle inheritance flag }

    CREATE_NEW_CONSOLE or { creation flags }

    NORMAL_PRIORITY_CLASS,

    nil, { pointer to new environment block }

    nil, { pointer to current directory name }

    StartupInfo, { pointer to STARTUPINFO }

    ProcessInfo) then { pointer to PROCESS_INF }

    Result := -1

    else begin

    WaitforSingleObject(ProcessInfo.hProcess,INFINITE);

    GetExitCodeProcess(ProcessInfo.hProcess,Result);

    end;

    end;





    procedure TForm1.Button1Click(Sender: TObject);

    var ret: integer;

    begin

    //노트패드를 실행시키고 끝나면 OK 라는 메세지 출력.

    while WinExecAndWait32('notepad.exe', '', 1) <> 0 do

    Application.ProcessMessages;

    ShowMessage('OK~');

    end;



    end.

  • Profile
    호야 2000.09.30 01:26
    이함수를 쓰면 도스창이 뜨거든요(제가 만든 프로그램을 실행시키면

    자동으로 도스창뜹니다) 도스창을 않보이게할수는 없나요?



    구창민 wrote:

    > blueSky wrote:

    > > 도움을 구합니다.

    > >

    > > WINEXEC 또는 ShellExecute 를 이용하여 도스명령어나 다른 실행파일을

    > > 실행한후 해당작업 완료라는 메세지를 띄우고 싶은데

    > >

    > > 제가 따로 실행시킨 프로그램의 끝나는 시점을 알고 싶습니다.

    > > 여러 고수님의 답변 부탁합니다.

    > >

    > >

    >

    > 안녕하세요~ 구창민입니다.

    > 아래는 함수는 32비트 체제에서 프로그램을 실행시키고 끝날때 까지

    > 기다리다 끝나는 시점을 알아내는 예제입니다.

    > 일전에 제가 테스트를 거친내용이므로 그냥 사용하셔도 될겁니다.

    > 그럼 ~ 즐거운 프로그래밍 하세요~

    >

    >

    > unit Unit1;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls, ShellApi;

    >

    > type

    > TForm1 = class(TForm)

    > Button1: TButton;

    > procedure Button1Click(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    > function WinExecAndWait32(FileName : PChar; CommandLine : PChar;

    > Visibility : Integer) : Integer;

    > var

    > zAppName:array[0..512] of char;

    > zCurDir:array[0..255] of char;

    > WorkDir:ShortString;

    > StartupInfo:TStartupInfo;

    > ProcessInfo:TProcessInformation;

    > begin

    > StrCopy(zAppName, FileName);

    > StrCat(zAppName, CommandLine);

    > GetDir(0, WorkDir);

    > StrPCopy(zCurDir, WorkDir);

    > FillChar(StartupInfo, Sizeof(StartupInfo),#0);

    > StartupInfo.cb := Sizeof(StartupInfo);

    > StartupInfo.dwFlags := STARTF_USESHOWWINDOW;

    > StartupInfo.wShowWindow := Visibility;

    > if not CreateProcess(nil,

    > zAppName, { pointer to command line string }

    > nil, { pointer to process security attributes}

    > nil, { pointer to thread security attributes }

    > false, { handle inheritance flag }

    > CREATE_NEW_CONSOLE or { creation flags }

    > NORMAL_PRIORITY_CLASS,

    > nil, { pointer to new environment block }

    > nil, { pointer to current directory name }

    > StartupInfo, { pointer to STARTUPINFO }

    > ProcessInfo) then { pointer to PROCESS_INF }

    > Result := -1

    > else begin

    > WaitforSingleObject(ProcessInfo.hProcess,INFINITE);

    > GetExitCodeProcess(ProcessInfo.hProcess,Result);

    > end;

    > end;

    >

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var ret: integer;

    > begin

    > //노트패드를 실행시키고 끝나면 OK 라는 메세지 출력.

    > while WinExecAndWait32('notepad.exe', '', 1) <> 0 do

    > Application.ProcessMessages;

    > ShowMessage('OK~');

    > end;

    >

    > end.