delphi4arab منتديات دلفي للعرب

نسخة كاملة : العمل بالدالة ShellExecute
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم

للدالة إستعمالات كثيرة نذكر منها :

( المسار يكتب إذا كان البرنامج المراد تفيده ليس في ملفات النظام أو نفس مجلد تطبيقنا )
لا تنسى إضافة : uses shellapi

* تشغيل برنامج :

كود :
ShellExecute(Handle, 'open', 'notepad.exe', nil, nil, SW_SHOWNORMAL) ;
أو
كود :
ShellExecute(Handle, 'open', 'c:\Windows\notepad.exe', nil, nil, SW_SHOWNORMAL) ;

* فتح الملفات :

كود :
ShellExecute(Handle,'open', 'Textfile.txt',nil, nil, SW_SHOWNORMAL) ;
أو
كود :
ShellExecute(Handle,'open', 'c:\windows\notepad.exe','Textfile.txt', nil, SW_SHOWNORMAL) ;

*فتح المشتكف على مسار محدد :

كود :
ShellExecute(Handle,'open', 'c:\', nil, nil, SW_SHOWNORMAL) ;
أو
كود :
ShellExecute(Handle,'open', 'explorer.exe', 'c:\', nil, SW_SHOWNORMAL) ;
أو
كود :
ShellExecute(handle, 'explore', 'c:\', nil, nil, SW_SHOWNORMAL);

* للطباعة ( طباعة ملف مباشرة دون فتحه ) ' الطباعة تكون على الطابعة الإفتراضية '

كود :
ShellExecute(Handle, 'print', PChar('textfile.txt'), nil, nil, SW_SHOW);

* فتح متصفح الويب الإفتراضي على الموقع المعطى

كود :
ShellExecute(Handle, 'open', 'http://www.delphi4arab.net/forum/',nil,nil, SW_SHOWNORMAL) ;

* لبعث إيميل ( فتح برنامج الإيميلات الإفتراضي مع ملئه بالقيم المعطاة )

كود :
var mailsubject, mailtext, mail : string; begin mailsubject := 'هذا هو موضوع الإيميل Subject '; mailtext := 'هذا هو نص الإيميل'; mail := 'mailto:Contact@delphi4arab.net?subject=' + mailsubject + '&body=' + mailtext ; ShellExecute(Handle,'open', PChar(mail), nil, nil, SW_SHOWNORMAL) ;

* تشغيل برنامج والإنتظار حتى إغلاقه ( مثال عند إغلاقه يظهر لنا مساج )
مثال عن الآلة الحسبة

كود :
unit Unit1; interface uses Windows, Messages, Variants, Classes, Graphics, Controls, Forms, Dialogs,shellapi, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure RunAndWaitShell(Executable, Parameter: STRING; ShowParameter: INTEGER); var Info: TShellExecuteInfo; pInfo: PShellExecuteInfo; exitCode: DWord; begin {Pointer to Info} pInfo := @Info; {Fill info} with Info do begin cbSize := SizeOf(Info); fMask := SEE_MASK_NOCLOSEPROCESS; wnd := application.Handle; lpVerb := NIL; lpFile := PChar(Executable); {Parametros al ejecutable} {Executable parameters} lpParameters := PChar(Parameter + #0); lpDirectory := NIL; nShow := ShowParameter; hInstApp := 0; end; {Execute} ShellExecuteEx(pInfo); {Wait to finish} repeat exitCode := WaitForSingleObject(Info.hProcess, 500); Application.ProcessMessages; until (exitCode <> WAIT_TIMEOUT); showmessage('تم إغلاق البرنامج'); form1.Enabled :=true; end; procedure TForm1.Button1Click(Sender: TObject); begin form1.Enabled :=false; RunAndWaitShell('calc','',1); end; end.
السلام عليكم

*تنفيذ أوامر الدوس
أمثلة
كود :
ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c copy file1.txt file2.txt'), nil, SW_SHOW);

كود :
* ShellExecute(Handle, 'open', PChar('command.com'), PChar('/k dir'), nil, SW_SHOW);

* *فتح المشتكف على مسار مع إختيار الملف المحدد ( خاصية الإختيار لا تعمل إذا كان المسار مفتوحا ) :

كود :
ShellExecute(Handle,'OPEN',PChar('explorer.exe'),PChar('/select, "' + selectedFileName + '"'),nil,SW_NORMAL)
Lam.Abdeldjalil كتب :السلام عليكم

*تنفيذ أوامر الدوس
أمثلة

و عليكم السلام و رحمة الله و بركاته
1- يمكن إختصار الأمر في :

PHP كود :
Uses
 ShellApi
;
procedure TForm1.Button1Click(Sender: TObject);
begin
 ShellExecute
(0,Nil{Open},'CMD',Pchar('/k "C:\1.exe&&Exit"'),Nil,0{SW_HIDE});
end; 

2- نقوم بتنفيذ أمر تحميل البرنامج 1.exe , بخاصية عرض SW_HIDE , لهذا توجب علينا
إنهاء Process الـ CMD بالأمر Exit .

3- للفصل بين أوامر الـ cmd , يكفي وضع && بين كل أمر و آخر .

بالتوفيق ,,
[COLOR="black"]وعليكم السلام ورحمة الله
موضوع ثري وشامل Smile
يمكن استخدام WinExec المعرفة في Windows.pas حالة التعامل مع الملفات التنفيذية، ينظر أيضا:
http://www.delphi4arab.net/forum/showthr...p?tid=2657
http://www.delphi4arab.net/forum/showthread.php?tid=600
إذا كان البرنامج لا يستخدم من ShellAPI إلا ShellExecute أفضل استيراد تعريفها بمثل هذا:
PHP كود :
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
  
Directory: PChar; ShowCmd: Integer): HINST; stdcall; external 'shell32.dll' name 'ShellExecuteA' 
وبذلك تتخلص من ShellAPI وتقلص حجم برنامجك
استدعي ShellExecuteW إذا وجدت حروف اللغة العربية (و Unicode عموما).[/COLOR]
السلام عليكم

بارك الله فيكم على إثراء الموضوع

وهذا مثال عن إستخدامات الدالة :
http://www.delphi4arab.net/forum/showthr...#post18842

و السلام عليكم
السلام عليكم


لإيقاف تشغيل الجهاز ( مع الإجبار لا مجال للتراجع ) ' 30 ثانية لإيقاف التشغيل'

كود :
ShellExecute(Handle, 'open', PChar('shutdown.exe'), PChar('-s'), nil, sw_show);


لإعادة تشغيل الجهاز ( مع الإجبار لا مجال للتراجع ) ' 30 ثانية لإعادة التشغيل'

كود :
ShellExecute(Handle, 'open', PChar('shutdown.exe'), PChar('-r'), nil, sw_show);

لتسجيل الخروج

كود :
ShellExecute(Handle, 'open', PChar('shutdown.exe'), PChar('-l'), nil, sw_show);

و السلام عليكم
تعيد الدالة قيمة أكبر من 32 إذا نجحت في تشغيل الملف
وتعيد قيمة خطأ يمكن فحصها لتحديد الخلل بأكثر دقة، مثال:
PHP كود :
procedure ExploreTo(handle:HWND ; page:PChar);
var
    
Returnvalue : integer;
begin
    ReturnValue 
:= ShellExecute(handle, 'open', page, nil, nil, SW_SHOWNORMAL);
    if 
ReturnValue <= 32 then
    
case Returnvalue of
     0 
: MessageBox(handle,'Error: Out of Memory','Error ExploreTo',0);
     
ERROR_FILE_NOT_FOUND: MessageBox(handle,'Error: File not found','Error ExploreTo',0);
     
ERROR_PATH_NOT_FOUND: MessageBox(handle,'Error: Directory not','Error ExploreTo',0);
     
ERROR_BAD_FORMAT : MessageBox(handle,'Fehler: Wrong format in EXE','Error ExploreTo',0);
     
// All other errors . See help for more ReturnValues of ShellExecute
     
else
     
MessageBox(handle,PChar('Error Nr: '+IntToStr(Returnvalue)+' in ShellExecute'),
                
'Error ExploreTo',0)
    
end //case
end; 
المزيد حول الدالة وأنواع الأخطاء من MSDN

WinExec تعيد قيمة أكبر من 31 عند النجاح، مثال:
PHP كود :
function Exec(Cmd: string; ShowConsole: Boolean): Boolean;
begin
  Result 
:= WinExec(PChar(Cmd), Ord(ShowConsole)) > 31;
end; 
المزيد من MSDN