المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : العمل بالدالة ShellExecute


Lam.Abdeldjalil
10-07-2010, 11:23 PM
السلام عليكم

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

( المسار يكتب إذا كان البرنامج المراد تفيده ليس في ملفات النظام أو نفس مجلد تطبيقنا )
لا تنسى إضافة : 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.com/forum/',nil,nil, SW_SHOWNORMAL) ;


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

var mailsubject, mailtext, mail : string;
begin
mailsubject := 'هذا هو موضوع الإيميل Subject ';
mailtext := 'هذا هو نص الإيميل';

mail := 'mailto:Contact@delphi4arab.com?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.

Lam.Abdeldjalil
11-07-2010, 10:11 AM
السلام عليكم

*تنفيذ أوامر الدوس
أمثلة
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'),P Char('/select, "' + selectedFileName + '"'),nil,SW_NORMAL)

TF6M
12-07-2010, 07:38 PM
السلام عليكم

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

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

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 , يكفي وضع && بين كل أمر و آخر .

بالتوفيق ,,

kachwahed
13-07-2010, 12:15 PM
وعليكم السلام ورحمة الله
موضوع ثري وشامل :)
يمكن استخدام WinExec المعرفة في Windows.pas حالة التعامل مع الملفات التنفيذية، ينظر أيضا:
http://www.delphi4arab.com/forum/showthread.php?t=2657
http://www.delphi4arab.com/forum/showthread.php?t=600
إذا كان البرنامج لا يستخدم من ShellAPI إلا ShellExecute أفضل استيراد تعريفها بمثل هذا:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
Directory: PChar; ShowCmd: Integer): HINST; stdcall; external 'shell32.dll' name 'ShellExecuteA'

وبذلك تتخلص من ShellAPI وتقلص حجم برنامجك
استدعي ShellExecuteW إذا وجدت حروف اللغة العربية (و Unicode عموما).

Lam.Abdeldjalil
13-07-2010, 02:33 PM
السلام عليكم

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

وهذا مثال عن إستخدامات الدالة :
http://www.delphi4arab.com/forum/showthread.php?p=18842#post18842

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

Lam.Abdeldjalil
16-07-2010, 09:51 PM
السلام عليكم


لإيقاف تشغيل الجهاز ( مع الإجبار لا مجال للتراجع ) ' 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);

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

kachwahed
15-01-2011, 08:08 AM
تعيد الدالة قيمة أكبر من 32 إذا نجحت في تشغيل الملف
وتعيد قيمة خطأ يمكن فحصها لتحديد الخلل بأكثر دقة، مثال:

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 (http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx)

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

المزيد من MSDN (http://msdn.microsoft.com/en-us/library/ms687393%28VS.85%29.aspx)