ورود

View Full Version : سوال: چگونه دستورات Dos را در دلفی اجرا کنم؟



mehdi_7
جمعه 24 مهر 1388, 20:21 عصر
چگونه می توان از درون محیط برنامه نویسی دلفی، دستورات مربوط به command prompt رو اجرا کرد.؟

Felony
جمعه 24 مهر 1388, 21:03 عصر
بارها بحث شده ، توسط تایع ShellExecute از یونیت ShellAPI

Mahmood_M
جمعه 24 مهر 1388, 21:46 عصر
و یا WinExec ، مثال :

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
WinExec('calc.exe', SW_SHOWNORMAL);
end;
کد بالا ماشین حساب ویندوز رو اجرا میکنه ...

موفق باشید ...

khoshblagh
شنبه 25 مهر 1388, 08:32 صبح
و یا WinExec ، مثال :

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
WinExec('calc.exe', SW_SHOWNORMAL);
end;
کد بالا ماشین حساب ویندوز رو اجرا میکنه ...

موفق باشید ...
برای اجرای NotePad کد مشابه را لازم دارم . متشکرم

Mahmood_M
شنبه 25 مهر 1388, 08:37 صبح
برای اجرای NotePad کد مشابه را لازم دارم . متشکرم
کافیه نام فایل Notepad رو بنویسید :

WinExec('NotePad.exe', SW_SHOWNORMAL);

موفق باشید ...

mehdi_7
شنبه 25 مهر 1388, 10:50 صبح
در دستور WinExec چگونه پارامترها را ارسال کنم. فرض کن یک دستور، چندین پارامتر داشته باشد

vcldeveloper
شنبه 25 مهر 1388, 15:58 عصر
در دستور WinExec چگونه پارامترها را ارسال کنم. فرض کن یک دستور، چندین پارامتر داشته باشد
WinExec یک تابع منسوخ شده هست، ازش استفاده نکنید. این تابع مربوط به ویندوزهای 16-بیتی هست، و در ویندوزهای 32-بیتی فقط برای حفظ Backward Compatibility نگهداری میشه.

mehdi_7
شنبه 25 مهر 1388, 17:13 عصر
آقای کشاورز، در هنگام استفاده از تابع shellexeute چگونه پارامتر ارسال کنم.
من می خواهم این دستور را اجرا کنم که دارای سه پارامتر است
shutdown /m \\computerName (file://\\computerName) /s

DAMAVAND
شنبه 25 مهر 1388, 17:36 عصر
اين جوري :


ShellExecute(Handle,'open','shutdown.exe','/m \\computerName /s',nil,SW_HIDE);

mehdi_7
شنبه 25 مهر 1388, 19:35 عصر
مرسی ....
حالا یک سوال، چطوری میشه تشخیص داد چه کامپیوترهایی الان در شبکه روشن هستند (وصل هستند)
مثلا اسم کامپیوترها (کلاینت ها) یی که الان وصل به شبکه هستند نمایش داده بشه

K.Mohammadreza
شنبه 25 مهر 1388, 20:00 عصر
تابع زير براي اجراي دستورات و برنامه ها بهتره اولا ميتونه منتظر باشه تا زماني که برنامه اجرا شده بسته شه و حالت اجرا را هم ميتونيد تعيين کنيد البته shellexceute‌هم ميتونه اين حالات را داشته باشه



Function RunProcess(Const AppPath:String;MustWait:Boolean=False;AppParams:St ring='';Visibility:Word=SW_SHOWNORMAL):DWord;
Var
SI:TStartupInfo;
PI:TPROCessINFORMATION;
Proc:THandle;
zFileName:Array[0..Max_Path*2]of char;
zParams:Array[0..Max_Path]of char;
begin
FillChar(SI,SizeOf(SI),0);
SI.cb:=SizeOf(Si);
Si.wShowWindow:=Visibility;
If Not CreateProcess(strPCopy(zFilename,AppPath),
StrPCopy(zParams,APpParams),
nil,nil,False,NORMAL_PRIORITY_CLASs ,nil,nil,SI,PI) then
Raise EXCeption.CreateFmt('Failed to execute program '+
apppath+'.Error Code %d',[GetlastError]);
Proc:=PI.hProcess;
CloseHandle(Pi.HThread);
If MustWait then
If WaitForSingleObject(Proc,infinite)<>Wait_Failed then
GetExitCodeProcess(Proc,Result);
CloseHandle(Proc);
end;

Felony
شنبه 25 مهر 1388, 20:31 عصر
مرسی ....
حالا یک سوال، چطوری میشه تشخیص داد چه کامپیوترهایی الان در شبکه روشن هستند (وصل هستند)
مثلا اسم کامپیوترها (کلاینت ها) یی که الان وصل به شبکه هستند نمایش داده بشه
نمونه ای رو که ضمیمه کردم ببینید .

mehdi_7
یک شنبه 26 مهر 1388, 00:29 صبح
مرسی، برنامه به درستی کار می کنه ولی...
ممکنه خواهش کنم یک توضیحی بدید که چه کار کردید در این کد؟ چون "هدف" یادگیری هست



unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
PNetResourceArray = ^TNetResourceArray;
TNetResourceArray = array[0..100] of TNetResource;
function CreateNetResourceList(ResourceType: DWord;
NetResource: PNetResource;
out Entries: DWord;
out List: PNetResourceArray): Boolean;
var
EnumHandle: THandle;
BufSize: DWord;
Res: DWord;
begin
Result := False;
List := Nil;
Entries := 0;
if WNetOpenEnum(RESOURCE_GLOBALNET,
ResourceType,
0,
NetResource,
EnumHandle) = NO_ERROR then begin
try
BufSize := $4000; // 16 kByte
GetMem(List, BufSize);
try
repeat
Entries := DWord(-1);
FillChar(List^, BufSize, 0);
Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
if Res = ERROR_MORE_DATA then
begin
ReAllocMem(List, BufSize);
end;
until Res <> ERROR_MORE_DATA;
Result := Res = NO_ERROR;
if not Result then
begin
FreeMem(List);
List := Nil;
Entries := 0;
end;
except
FreeMem(List);
raise;
end;
finally
WNetCloseEnum(EnumHandle);
end;
end;
end;

procedure ScanNetworkResources(ResourceType, DisplayType: DWord; List: TStrings);
procedure ScanLevel(NetResource: PNetResource);
var
Entries: DWord;
NetResourceList: PNetResourceArray;
i: Integer;
begin
if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) then try
for i := 0 to Integer(Entries) - 1 do
begin
if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or
(NetResourceList[i].dwDisplayType = DisplayType) then begin
List.AddObject(NetResourceList[i].lpRemoteName,
Pointer(NetResourceList[i].dwDisplayType));
end;
if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then
ScanLevel(@NetResourceList[i]);
end;
finally
FreeMem(NetResourceList);
end;
end;
begin
ScanLevel(Nil);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, ListBox1.Items);
end;
end.

vcldeveloper
یک شنبه 26 مهر 1388, 11:18 صبح
به دلیل پرسیدن سوالات غیر مرتبط با موضوع تاپیک، تاپیک قفل شد.