有關WinExec的問題 |
尚未結案
|
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
我寫了以下的程式
Memo1.Clear;
WinExec('cmd /c c:\kk.bat',SW_HIDE );
Memo1.Lines.LoadFromFile('c:\tmp'); 在執行
Memo1.Lines.LoadFromFile('c:\tmp');
出現程序無法存取檔案因為檔案正由另一個程序使用
這該用什麼方式解決 kk.bat內容如下
delete c:\tmp
XCOPY D:\930401\HOP3\LABEL1\*.* D:\test\ /s > c:\tmp
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
引言: 我寫了以下的程式 Memo1.Clear; WinExec('cmd /c c:\kk.bat',SW_HIDE ); Memo1.Lines.LoadFromFile('c:\tmp'); 在執行 Memo1.Lines.LoadFromFile('c:\tmp'); 出現程序無法存取檔案因為檔案正由另一個程序使用 這該用什麼方式解決 kk.bat內容如下 delete c:\tmp XCOPY D:\930401\HOP3\LABEL1\*.* D:\test\ /s > c:\tmp function WinExecAndWait(FileName:String; Visibility : integer):Thandle; var zAppName:array[0..512] of char; zCurDir:array[0..255] of char; WorkDir:String; StartupInfo:TStartupInfo; ProcessInfo:TProcessInformation; begin StrPCopy(zAppName,FileName); 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,nil,nil,false,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo, ProcessInfo) then begin Result :=0; exit; end else begin WaitforSingleObject(ProcessInfo.hProcess,INFINITE); GetExitCodeProcess(ProcessInfo.hProcess,Result); end; end; .... Memo1.Clear; WinExecAndWait('cmd /c c:\kk.bat',SW_HIDE); Memo1.Lines.LoadFromFile('c:\tmp\???'); //檔案是什麼,自己填網海無涯,學無止境! |
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
我試了這個,但發現執行XCOPY D:\930401 /S/F D:\test\時,有執行但COPY的資料不完全,且XCOPY的內容都沒顯示出來?我以找不到你說的東東
procedure RunDosInMemo(DosApp:String;AMemo:TMemo);
const ReadBuffer = 2400;
var Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartupInfo;
ProcessInfo : TProcessInformation;
Buffer : Pchar;
BytesRead : DWord;
Apprunning : DWord;
begin
With Security do begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, WritePipe, @Security, 0) then begin
Buffer := AllocMem(ReadBuffer 1);
FillChar(Start,Sizeof(Start),#0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
if CreateProcess(nil,PChar(DosApp),@Security,@Security,true,CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS,nil,nil,start,ProcessInfo) then begin
repeat
Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT);
Repeat
BytesRead := 0;
ReadFile(ReadPipe,Buffer[0],ReadBuffer,BytesRead,nil);
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer);
AMemo.Text := AMemo.text String(Buffer);
until (BytesRead < ReadBuffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |