Q&A

  • dos명령을 델파이에서 실행시킬려고 하는데...netstat -n>a.txt
dos명령을 델파이에서 실행시킬려고 하는데..잘 않되네요..

netstat -n까지는 실행이 되는데..winexec를 써서 했거든요....

netstat -n>a.txt는 실행이 않되요..

dos에서는 위 명령어가 실행이 되거든요...

델파이에서는...다르게 추가해야할 뭔가가 있는건가요??

2  COMMENTS
  • Profile
    김영대 1999.10.12 23:56
    장영선 wrote:

    > dos명령을 델파이에서 실행시킬려고 하는데..잘 않되네요..

    > netstat -n까지는 실행이 되는데..winexec를 써서 했거든요....

    > netstat -n>a.txt는 실행이 않되요..

    > dos에서는 위 명령어가 실행이 되거든요...

    > 델파이에서는...다르게 추가해야할 뭔가가 있는건가요??



    unit Unit1;



    interface



    uses

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

    StdCtrls;



    type

    TForm1 = class(TForm)

    Button1: TButton;

    Memo1: TMemo;

    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('netstat -a', 'netstat.txt', True) = 0 then

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

    end;



    end.





  • Profile
    김의만 1999.12.02 19:54
    > function WinExecAndWait32(Path: PChar; Visibility: Word): integer;

    > var

    > Msg: TMsg;

    > lpExitCode : integer;

    > StartupInfo: TStartupInfo;

    > ProcessInfo: TProcessInformation;



    저도 비슷한 처리가 필요해서 도움을 받았습니다. 감사합니다.

    그런데 위의 변수선언중 lpExitCode를 Integer가 아니라 LongWord로 해야 되더군요..

    참고로 하십시요..