با سلام!
در صورتی که بخواهیم یک دستور CMD را در دلفی وارد کنیم باید چه کنیم؟
برای مثال اگر بخواهیم که فایل
C:\Test.exe
را اجرا کنیم باید چه دستوری بنویسیم؟
لطفا هرکس اطلاعاتی دارد راهنمایی کند!!
Printable View
با سلام!
در صورتی که بخواهیم یک دستور CMD را در دلفی وارد کنیم باید چه کنیم؟
برای مثال اگر بخواهیم که فایل
C:\Test.exe
را اجرا کنیم باید چه دستوری بنویسیم؟
لطفا هرکس اطلاعاتی دارد راهنمایی کند!!
اتفاقا این سوال رو منم دارم. سوال اصلیم اینه که میشه به برنامه CommandPrompt پارامتر ارسال کرد؟ هرچی سعی کردم نشد
روش های زیادی وجود داره ولی روشی که من استفاده می کنم استفاده از فایل Bat هست که اتفاقاً قدرت بیشتری هم داره و میتونید یک سری کارهای دسته جمعی هم انجام بدید.
شما می تونید کدهای مورد نظرتون رو از قبل بصورت ثابت و یا بصورت داینامیک در برنامه، به یک فایل Bat بریزید و سپس اونو اجرا کنید.
برای اجرای فایل Bat هم میتونید از این روش استفاده کنید:
کد:ShellExecute(0,'Open',ExtractFilePath(Application.exename)+'test.bat',nil,nil,SW_SHOW);
با تشکر از Sorrowdancer به خاطر این دستورات اما مشکل اینجاست که فایل batch قابل ویرایش با حتی notepad بوده و علاوه برآن باید وجود خارجی داشته باشد, اما من به دنبال روشی هستم که نتوان محتویات آنرا تغییر داد یا حداقل به روش text نوشته نشده باشد.(قابل فهم برای هر کاربری نباشد یا همان روش Binary)
به هر حال ممنونم!
در ضمن لطفا کمی دستوری را که نوشتید توضیح دهید.
از اين تابع استفاده كنيد. راه ساده تري هم داره ولي يادم نيست:
کد:function RunProg(Cmd, WorkDir: String): string;
var
tsi: TStartupInfo;
tpi: TProcessInformation;
nRead: DWORD;
aBuf: Array[0..101] of char;
sa: TSecurityAttributes;
hOutputReadTmp, hOutputRead, hOutputWrite, hInputWriteTmp, hInputRead,
hInputWrite, hErrorWrite: THandle;
FOutput: String;
begin
FOutput := '';
sa.nLength := SizeOf(TSecurityAttributes);
sa.lpSecurityDescriptor := nil;
sa.bInheritHandle := True;
CreatePipe(hOutputReadTmp, hOutputWrite, @sa, 0);
DuplicateHandle(GetCurrentProcess(), hOutputWrite, GetCurrentProcess(),
@hErrorWrite, 0, true, DUPLICATE_SAME_ACCESS);
CreatePipe(hInputRead, hInputWriteTmp, @sa, 0);
// Create new output read handle and the input write handle. Set
// the inheritance properties to FALSE. Otherwise, the child inherits
// the these handles; resulting in non-closeable handles to the pipes
// being created.
DuplicateHandle(GetCurrentProcess(), hOutputReadTmp, GetCurrentProcess(),
@hOutputRead, 0, false, DUPLICATE_SAME_ACCESS);
DuplicateHandle(GetCurrentProcess(), hInputWriteTmp, GetCurrentProcess(),
@hInputWrite, 0, false, DUPLICATE_SAME_ACCESS);
CloseHandle(hOutputReadTmp);
CloseHandle(hInputWriteTmp);
FillChar(tsi, SizeOf(TStartupInfo), 0);
tsi.cb := SizeOf(TStartupInfo);
tsi.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
tsi.hStdInput := hInputRead;
tsi.hStdOutput := hOutputWrite;
tsi.hStdError := hErrorWrite;
CreateProcess(nil, PChar(Cmd), @sa, @sa, true, 0, nil, PChar(WorkDir),
tsi, tpi);
CloseHandle(hOutputWrite);
CloseHandle(hInputRead );
CloseHandle(hErrorWrite);
Application.ProcessMessages;
repeat
if (not ReadFile(hOutputRead, aBuf, 16, nRead, nil)) or (nRead = 0) then
begin
if GetLastError = ERROR_BROKEN_PIPE then Break
else MessageDlg('Pipe read error, could not execute file', mtError, [mbOK], 0);
end;
aBuf[nRead] := #0;
FOutput := FOutput + PChar(@aBuf[0]);
Application.ProcessMessages;
until False;
Result := FOutput;
//GetExitCodeProcess(tpi.hProcess, nRead) = True;
end;
فکر کنم این دستور مشکلاتتون رو حل کنه:
کد:ShellExecute(Handle, nil, 'cmd.exe', '/K cd C:\WINDOWS', nil, SW_SHOWNORMAL);
سوئیچ K/ برای اینه که دستور وارد شده سریعا بعد از اجرای CMD اجرا بشه، میتونید نذاریدش. از سوئیچ C/ هم میتونید برای بستن CMD پس از اجرای دستور استفاده کنید
ممنون اما من نمی دانم که این دستور به کدام کتابخانه در Uses نیاز دارد؟
از WinEXEC هم میتونی استفاده کنی. توی هلپ هم یک نگاهی بینداز.
جواب های نهایی:با تشکر از همه ی دوستان این بخش یک خلاصه برای کاربرانی است که جواب نهایی را می خواهند:
دستور اول:
در صورتی کتابخانه ی ShellApi را در Uses وارد کنید می توانید از این دستور استفاده کنید:
[PHP]ShellExecute(Handle, nil, 'cmd.exe', '/K cd Command', nil, SW_SHOWNORMAL);[/PHP]
که دارای سوییچ /K برای اجرای سریع و /C برای بستن خط فرمان در انتها است.
از Command هم می توانید برای دستوری که به CMD می نویسید استفاده کنید.
دستور دوم:
در صورتی که بخواهید یک برنامه ی EXE را اجرا کنید از این دستور استفاده کنید:
[PHP]WinExec(Command,Handle Type);[/PHP]
که Command محل فایل شما و Handle Type مقداری است که مشخص می کند برنامه چگونه باید اجرا شود و دارای این مقادیر است:Sw_Minimize
Sw_Hide
Sw_Maximize
.
.
.و غیره می باشد.
با أرزوی موفقیت.پایان