Q&A

  • 도스창 하나로 실행시키기
안녕하세요.

저는 임으로 .BAT화일을 실행 시키는 프로그램을 짰는데..

일정시간마다 실행을 시킵니다.

문제는 bat를 실행 시킬때마다 도스창이 계속뜬다는 겁니다.

한창에서 실행을 시키고 싶은데 방법을 알려주세요.



1. 먼저 제가 해본 방법은 findwindow로 찾아서 임의로 죽이는 겁니다.



CallExe(pchar('c:isam.bat'),sw_ShowNormal);

h := FindWindow( nil, '한글 MS-DOS' );

if h = 0 then

showmessage('not found')

else

SendMessage( h, WM_CLOSE, 0, 0 );



이걸로 했는데.. 계속 'not found'만 뜹니다..

bat를 실행시키는 대신

CallExe(pchar('C:WINDOWSCOMMAND.COM'),sw_ShowNormal);

로 도스창만 띄울땐 원하는대로 한창만 뜹니다.





2. 도스로 띄운 프로그램을 무작정 지울게 아니라...

실행이 끝나면 저절로 창을 닫게 하는게 있나요??

찾아보니..shell('COMMAND.COM /C '); 이라는게 있던데..

델파이에선 못쓰는것 같더군요..

이비슷한 기능 있는것 없나요??



만약 제 설명이 부족하시면 연락 바랍니다.

mail ejkim@hanawool.co.kr



감사합니다.





1  COMMENTS
  • Profile
    김영대 1999.10.30 00:24
    김은정 wrote:

    > 안녕하세요.

    > 저는 임으로 .BAT화일을 실행 시키는 프로그램을 짰는데..

    > 일정시간마다 실행을 시킵니다.

    > 문제는 bat를 실행 시킬때마다 도스창이 계속뜬다는 겁니다.

    > 한창에서 실행을 시키고 싶은데 방법을 알려주세요.

    >

    > 1. 먼저 제가 해본 방법은 findwindow로 찾아서 임의로 죽이는 겁니다.

    >

    > CallExe(pchar('c:isam.bat'),sw_ShowNormal);

    > h := FindWindow( nil, '한글 MS-DOS' );

    > if h = 0 then

    > showmessage('not found')

    > else

    > SendMessage( h, WM_CLOSE, 0, 0 );

    >

    > 이걸로 했는데.. 계속 'not found'만 뜹니다..

    > bat를 실행시키는 대신

    > CallExe(pchar('C:WINDOWSCOMMAND.COM'),sw_ShowNormal);

    > 로 도스창만 띄울땐 원하는대로 한창만 뜹니다.

    >

    >

    > 2. 도스로 띄운 프로그램을 무작정 지울게 아니라...

    > 실행이 끝나면 저절로 창을 닫게 하는게 있나요??

    > 찾아보니..shell('COMMAND.COM /C '); 이라는게 있던데..

    > 델파이에선 못쓰는것 같더군요..

    > 이비슷한 기능 있는것 없나요??

    >

    > 만약 제 설명이 부족하시면 연락 바랍니다.

    > mail ejkim@hanawool.co.kr

    >

    > 감사합니다.



    unit Unit1;



    interface



    uses

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

    StdCtrls;



    type

    TForm1 = class(TForm)

    Memo1: TMemo;

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation

    {$R *.DFM}



    {32bit 프로그램을 실행시키는 모듈입니다}

    function WinExecAndWait32(Path: PChar; Visibility: Word): integer;

    var

    Msg: TMsg;

    lpExitCode : integer;

    StartupInfo: TStartupInfo;

    ProcessInfo: TProcessInformation;

    begin

    FillChar(StartupInfo, SizeOf(TStartupInfo), 0);

    with StartupInfo do

    begin

    cb := SizeOf(TStartupInfo);

    dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;

    wShowWindow := visibility;

    end;

    if CreateProcess(nil, path, nil, nil, False,

    NORMAL_PRIORITY_CLASS OR CREATE_SEPARATE_WOW_VDM,

    nil, nil, StartupInfo, ProcessInfo) then

    begin

    repeat

    while PeekMessage(Msg, 0, 0, 0, pm_Remove) do

    begin

    if Msg.Message = wm_Quit then

    Halt(Msg.WParam);

    TranslateMessage(Msg);

    DispatchMessage(Msg);

    end;

    GetExitCodeProcess(ProcessInfo.hProcess,lpExitCode);

    until (lpExitCode <> Still_Active);



    with ProcessInfo do

    begin

    CloseHandle(hThread);

    CloseHandle(hProcess);

    end;

    Result := 0; {sucess}

    end

    else

    Result := GetLastError; {error occurs during CreateProcess}

    end;



    function ExecuteDOSCommand(cmdline, logfile:String; hidden: Boolean): integer;

    const

    flags: array [Boolean] of Integer = (SW_SHOWNORMAL, SW_HIDE);

    // array[Boolean] -> array[0..1] 입니다

    // 테스트:

    // ShowMessage(IntToStr(Ord(False)));

    // ShowMessage(IntToStr(Ord(True)));

    var

    cmdbuffer: array [0..MAX_PATH] of Char;

    cmd: String;

    begin

    // Windows 95/98의 환경변수 COMSPEC는 command.com 입니다

    GetEnvironmentVariable('COMSPEC', cmdBUffer, Sizeof(cmdBuffer));

    // command.com의 /C 파라미터는 명령 실행 후 되돌아 가라는 옵션입니다

    cmd := cmdbuffer + ' /C ' + cmdline + ' > ' + logfile;

    // 실행이 종료될때까지 대기

    Result := WinExecAndWait32(PChar(cmd), flags[hidden]); // SW_HIDE 로 실행

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    begin

    if ExecuteDOSCommand('dir /w', 'dir.txt', True) = 0 then

    Memo1.Lines.LoadFromFile('dir.txt');

    end;



    end.