PDA

View Full Version : اجرای دستورات cmd



djscsi
دوشنبه 24 تیر 1387, 01:48 صبح
چه طوری میشه برنامه ای نوشت کا مثل cmd همون دستورات رو بدی و اونا رو اجرا کنه
ممنون

SYNDROME
دوشنبه 24 تیر 1387, 06:37 صبح
چه طوری میشه برنامه ای نوشت کا مثل cmd همون دستورات رو بدی و اونا رو اجرا کنه
ممنون
برای اجرا دستورات در Run از دستور Winexec استفاده کنید.
کلمه فوق را در سایت جستجو کنید.
موفق باشید

B-Vedadian
دوشنبه 24 تیر 1387, 08:45 صبح
winexec یک تابع منسوخ هستش، CreateProcess بجای اون باید استفاده بشه.

در ضمن، برای کاری که شما میخواید، دستورش اینه


cmd.exe /c «دستور مورد نظر» و واسه دلفی


var
pi: TProcessInformation;
si: TStartupInfo;
cmd_command: String;
.
.
.
fillMemory(@si, sizeof(si),0);
si.cb := sizeof( si );

CreateProcess(
'cmd.exe',
PChar('/c ' + cmd_command),
nil, nil, false,
NORMAL_PRIORITY_CLASS, nil, nil,
si, pi );

CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

برنامه رو بصورت کنسول درست کنی، خروجی دستورات تو همون کنسول برنامه خودت نمایش داده میشه.

djscsi
دوشنبه 24 تیر 1387, 20:15 عصر
ممنون ولی در مورد کد دومی بیشتر تو ضیح میدی
دستورات از کجا گرفته میشه ؟به جای cmd_command دستورات قرار می گیره؟ایا به جای اون میشه نوشت edit1.text ?

B-Vedadian
دوشنبه 24 تیر 1387, 22:18 عصر
کد کامل رو که ننوشتم - هر چند همين بخش کد هم مستقلا قابل اجراست فقط بايد قبلش به cmd_command مقدار بدي. جواب سؤال دومت بله هست. جواب سؤال آخرت رو هم يک نگاه کوچک به کد بندازي ميگيري.

کد هر چند کار ميکنه ولي در مورد کنسول اشتباه کردم يه نمونه برنامه ميذارم. وقتي دستور vedadian و يا islam رو وارد کنيد، برنامه من جواب ميده و اگه دستور ديگه اي بديد، مثل اينه که تو خط فرمان cmd.exe اجرا کنيدش (مثلا dir)


program Project2;

{$APPTYPE CONSOLE}

uses
Windows, SysUtils;

var
pi: TProcessInformation;
si: TStartupInfo;
cmd_command: String;
cp: THandle;
begin
fillMemory(@si, sizeof(si),0);
si.cb := sizeof( si );
cp := GetCurrentProcess;
if not DuplicateHandle(cp, STD_INPUT_HANDLE, cp, @si.hStdInput, 0, True, DUPLICATE_SAME_ACCESS) then
Exit;
if not DuplicateHandle(cp, STD_OUTPUT_HANDLE, cp, @si.hStdOutput, 0, True, DUPLICATE_SAME_ACCESS) then
Exit;
if not DuplicateHandle(cp, STD_ERROR_HANDLE, cp, @si.hStdError, 0, True, DUPLICATE_SAME_ACCESS) then
Exit;
si.dwFlags := STARTF_USESTDHANDLES;
while LowerCase(cmd_command) <> 'exit' do
begin
if LowerCase(cmd_command) = 'vedadian' then
writeln('Please pray for him...')
else if LowerCase(cmd_command) = 'islam' then
writeln('Precious gift of God to mankind.')
else
begin
CreateProcess(
nil,
PChar('cmd.exe /c ' + cmd_command),
nil, nil, True,
NORMAL_PRIORITY_CLASS, nil, nil,
si, pi );
WaitForSingleObject(pi.hProcess, 2000);
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
end;
readln(cmd_command);
end;
end.

djscsi
سه شنبه 25 تیر 1387, 00:54 صبح
ممنون ولی اینو نمیشه کاریش کرد که تحت consol نباشه مثلا همه نوشته ها تو یه memo بیاد و دستورات هم تو همون memo نوشته بشه
ممنون

B-Vedadian
سه شنبه 25 تیر 1387, 07:46 صبح
قبلا در مورد این توضیح دادم
http://barnamenevis.org/forum/showpost.php?p=526613&postcount=10

djscsi
پنج شنبه 27 تیر 1387, 23:12 عصر
ممنون ولی برای همه دستورات اجرا نمیشه
مثلا cd
ممنون میشم کمک کنی
در مورد اینم یه توضیحی میدی
CreateProcess(
nil,
PChar('cmd.exe /c ' + cmd_command),
nil, nil, True,
NORMAL_PRIORITY_CLASS, nil, nil,
si, pi );
به ویژه اینجاش cmd.exe /c

B-Vedadian
جمعه 28 تیر 1387, 10:40 صبح
يعني چي که اجرا نميشه! دستور cd که خروجي به کنسول نداره.

در مورد CreateProcess، بايد بگم يک دستور API ويندوز براي اجراي فايل هستش. فايل cmd.exe رابط ويندوزهاي 2000 و XP براي خط فرمان داسه (command prompt). پارامتر c به cmd.exe ميگه که پارامتر بعدي رو اجرا کنه، و بلا فاصله بعد اجرا برگرده.

djscsi
جمعه 28 تیر 1387, 23:29 عصر
منظورم دستور cd.. یا cd\ هست
شما این کارو بکن ببین میشه یا نه مثلا به دستور cd\ به ریشه drive برو و یه dir اجرا کن ببین رفته یا نه اگه رفته باشه باید الان نام پوشه هایی که تو drive هست رو بنویسه

djscsi
جمعه 28 تیر 1387, 23:31 عصر
منظورم دستور cd.. یا cd\ هست
شما این کارو بکن ببین میشه یا نه مثلا به دستور cd\ به ریشه drive برو و یه dir اجرا کن ببین رفته یا نه اگه رفته باشه باید الان نام پوشه هایی که تو drive هست رو بنویسه