안녕하세요.
저는 임으로 .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
감사합니다.
> 안녕하세요.
> 저는 임으로 .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.