PDA

View Full Version : سوال: نمایش برگشتی دستورات کامندی در برنامه



Mask
یک شنبه 15 اسفند 1389, 22:47 عصر
با سلام
مثلا من دستور Dir رو توسط برنامم اجرا میکنم.
چطوری میتونم برگشتی این دستور رو مثلا در یک ممو ببینم.
ممنون از جوابتون.

Felony
دوشنبه 16 اسفند 1389, 08:27 صبح
تابع :

function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string;
var
SA: TSecurityAttributes;
SI: TStartupInfo;
PI: TProcessInformation;
StdOutPipeRead, StdOutPipeWrite: THandle;
WasOK: Boolean;
Buffer: array[0..255] of AnsiChar;
BytesRead: Cardinal;
WorkDir: string;
Handle: Boolean;
begin
Result := '';
with SA do begin
nLength := SizeOf(SA);
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
try
with SI do
begin
FillChar(SI, SizeOf(SI), 0);
cb := SizeOf(SI);
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
WorkDir := Work;
Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
nil, nil, True, 0, nil,
PChar(WorkDir), SI, PI);
CloseHandle(StdOutPipeWrite);
if Handle then
try
repeat
WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
if BytesRead > 0 then
begin
Buffer[BytesRead] := #0;
Result := Result + Buffer;
end;
until not WasOK or (BytesRead = 0);
WaitForSingleObject(PI.hProcess, INFINITE);
finally
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
end;
finally
CloseHandle(StdOutPipeRead);
end;
end;

استفاده :

Memo1.Text := GetDosOutput('dir', 'd:\');

راه دیگه هم اینکه خروجی دستورات اجرا شده رو تو یک فایل بریزید و فایل رو تو برنامه باز کنید ، مثلا برای ذخیره خروجی دستور dir تو فایل A.txt :

dir>a.txt

mbshareat
دوشنبه 16 اسفند 1389, 18:30 عصر
با سلام
جناب آقای تاجیک گرامی آیا کد آماده ای برای این کار سراغ ندارین.من تو زبان VB با خوندن فایلی شبیه a.txt که در دستور Dir>a.txt گفتید با Line Input گاهی مشکل داشتم که البته اشکال از کد من نبود و این کد گاهی کل خط رو نمی خوند.
آیا تو توابع API برای بدست آوردن خروجی دستور داس در یک رشته تابعی داریم؟

Mask
دوشنبه 16 اسفند 1389, 18:42 عصر
من از تابع بالا استفاده کردم که به درستی کار میداد.

Felony
دوشنبه 16 اسفند 1389, 21:07 عصر
آیا تو توابع API برای بدست آوردن خروجی دستور داس در یک رشته تابعی داریم؟
خیر تابع API برای همچین کاری وجود نداره ، میتونید همون تابع رو ترجمه کنید .

Mask
یک شنبه 22 اسفند 1389, 13:39 عصر
ممنون از آقا مجتبی
برا دلفی های 2009 به بالا که یونیکد رو پشتیبانی میکنه میتونید از پست زیر استفاده کنید.
http://barnamenevis.org/showthread.php?178069-%DA%AF%D8%B1%D9%81%D8%AA%D9%86-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-%DB%8C%DA%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%DA%A9%D9%86%D8%B3%D9%88%D9%84-%D8%AF%D8%B1-Memo-%D8%AF%D8%B1-%D8%AF%D9%84%D9%81%DB%8C-2009