تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
من المنتدى القديم - تشغيل الملفات
#1
كاتب الموضوع : أحمد جمال

هي مجموعة من الدروس والمقالات التي كانت موجودة منذ مدة في المنتديات ولكنها ضاعت مع ضياع قاعدة البيانات ، هذه واحدة منها :
اعداد : الأخ عاصفة .
عنوان الموضوع : تشغيل الملفات .


هناك عدد من الطرق التي تمكنك من تشغيل الملفات في بيئة ويندوز باستخدام لغة فيجوال بيسك .. وقد حاولت جمع اهم هذه الطرق في هذا الموضوع لعله يكون مرجعا بهذا الشأن .. وقد فضلت تقسيم الموضوع على اساس نوعية الملفات المراد تشغيلها وسابدء بالملفات التنفيذية يتبعها انواع الملفات الاخرى ...

أولا:الملفات التنفيذية

أ - باستخدام اوامر فيجوال بيسك ...

- الدالة Shell
الوظيفة:
الدالة shell هي الدالة التي توفرها لغة فيجوال بيسك لتشغيل التطبيقات.
الصيغة العامة:

كود :
Shell(pathname[,windowstyle])
القيمة التي تعيدها الدالة:
صفر في حالة عدم نجاح المهمة و ProcessId (معرف العملية) في حالة النجاح.
وسيطات الدالة:
PathName : مسار الملف التنفيذي(التطبيق) المراد تشغيله.
WindowStyle: طريقة عرض النافذة الاساية للبرنامج.وياخذ هذا الوسيط عدد من الثوابت الموجودة في الجدول التالي ...

مثال:

كود :
Dim Ret&
Ret = Shell("notepad.exe", 1)
'واذا كانت القيمة المعادة ليست ذات قيمة لتطبيقك
'فيكفي ان تكتب
Shell "notepad.exe", 1

ب - باستخدام اجراءات واجهة برمجة التطبيقات API ...

1- الدالة WinExec
الوظيفة:
تشبه الدالة السابقة تماما.
التصريح للدالة:

كود :
Declare Function WinExec& Lib "kernel32" (ByVal _
lpCmdLine As String, ByVal nCmdShow As Long
مثال:

كود :
Private Sub Command1_Click()
Dim Ret&
Ret = WinExec("Notepad.exe c:Test.txt", vbMaximizedFocus)
End Sub
2- الدالة CreateProcess
الوظيفة: كوظائف الدوال السابقة، تقوم بتشغيل الملفات التنفيذية.. ومن الجدير بالذكر هنا أن نقول أن هذه الدالة هي الأصل في جميع الدوال السابقة حيث أن جميع الدوال تعتمد عليها عند انشاء العملية
التصريح للدالة:

كود :
Declare Function CreateProcess Lib "kernel32" Alias _
"CreateProcessA" (ByVal lpApplicationName As String, _
ByVal lpCommandLine As String, lpProcessAttributes _
As SECURITY_ATTRIBUTES, lpThreadAttributes As _
SECURITY_ATTRIBUTES, ByVal bInheritHandles As _
Long, ByVal dwCreationFlags As Long, lpEnvironment _
As Any, ByVal lpCurrentDriectory As String, _
lpStartupInfo As STARTUPINFO, lpProcessInformation _
As PROCESS_INFORMATION) As Long
مثال:
قمت بعمل مثال تجده على الرابط ..

ملاحظة:
لم اقم بشرح كل الوسيطات والبنى بل قمت بالتركيز على كيفية تشغيل الملفات التنفيذية ..

ثانيا: كيفية تشغيل الملفات الاخرى..
لا يمكن تشغيل الملفات المرتبطة ببرامج معينه من خلال الدالتين Shell وWinExec مباشرة ولكن يجب علينا تمرير البرنامج المشغل قبل تمرير اسم الملف التشغيلي مثلا لنفترض اننا نريد تشغيل الملف النصي Test.txt والموجود على المجلد الجذري فاننا حينها نقوم نقوم بتمرير البرنامج المشغل وليكن في هذه الحالة notepad فاننا نكتب الكود كالتالي..

كود :
Shell "Notepad.exe C:Test.txt", 1

ولعلك تتسائل الا توجد طريقة للحصول على البرنامج المشغل فالجواب هو نعم .. ولو فكرت سريعا ستجد او فكرة تخطر على بالك هي ستخدام مسجل النظام(الريجيستري) وهذه الطريقة ممتازة وسوف نعتمد على الدالة RegQueryValueEx لقراءة القيمة ورغم ان هذه الطريقة مفيده وفعالة إلا انها تعتبر طويله وتتطلب كتابة اجرائية طويلة للوصول إلى المطلوب.. وهنا يتجلى الحل الآخر من خلال دالة API المسماه FindExecutable
ولنتوقف قليلا عند هذه الدالة لنقوم بشرح جوانبها لارتباطها بالموضوع..
الوظيفة:
ايجاد البرنامج المشغل لملف معين.
التصريح للدالة:

كود :
Declare Function FindExecutable Lib "shell32.dll" Alias _
"FindExecutableA" (ByVal lpFile As String, ByVal _
lpDirectory As String, ByVal lpResult As String) _
As Long
لائحة الوسيطات:
lpFile : اسم الملف المراد تشغيله.
lpDirectory : مسار الملف السابق.
lpResult : متغير لتخزين مسار البرنامج المشغل.
والآن سنقوم بعمل دالة عند تمرير ملف لها فإنها ستقوم بايجاد البرنامج المشغل... ومن ثم تشغيل الملف..

كود :
Private Declare Function FindExecutable Lib "shell32.dll" _
Alias "FindExecutableA" (ByVal lpFile As String, ByVal _
lpDirectory As String, ByVal lpResult As String) _
As Long
Sub ShellFile(FileName As String)
Dim Byt_Pos As Byte, str_Buf As String * 256
Dim lpFile$, lpDirectory$
Byt_Pos = InStr(StrReverse(FileName), "")
'استخراج اسم الملف
lpFile = Right(FileName, Byt_Pos - 1)
'اسم المجلد
lpDirectory = Left(FileName, Len(FileName) - Byt_Pos)
'الحصول على البرنامج المشغل
FindExecutable lpFile, lpDirectory, str_Buf
'استخلاص اسم ومسارالبرنامج المشغل من القيمة الموجودة في المخزن
str_Buf = Mid(str_Buf, 1, InStr(str_Buf, Chr(0)) - 1)
Shell str_Buf & " " & FileName, 1
End Sub
Private Sub Command1_Click()
ShellFile "c:Test.txt"
End Sub
ما رأيك الآن .. اليس هذا جميلا .... لقد استطعت أن تقوم بتشغيل مختلف أنواع الملفات ولكن للاسف تحتاج لمزيد من الاكواد إذا كنت لاتعلم هل الملف تنفيذي ام ملف مقترن .... يكمن المخرج من هذا المأزق في استخدام الدالة ShellExecute لتشغيل كافة أنواع الملفات التنفيذية والملفات المرتبطة ببرنامج معين ..

ثالثا: تشغيل كافة أنواع الملفات

- الدالة ShellExecute

الوظيفة:
تشغيل كافة انواع الملفات القابلة للتشغيل أوطباعتها حيث انه عندما يكون الملف عبارة عن ملفا مقترنا فإن الدالة تستخرج البرنامج المشغل ثم تقوم بتشغيله.
تصريح الدالة:

كود :
Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation _
As String, ByVal lpFile As String, ByVal lpParameters _
As String, ByVal lpDirectory As String, ByVal nShowCmd _
As Long) As Long
وسيطات الدالة:
hwnd : مقبض النافذة.
lpOperation : احدى المعاملين "Print" للطباعة و "Open" للفتح.
lpFile : اسم الملف لمراد تطبيق العملية عليه.
lpParameters : الوسيطات المراد تمريرها إلى جوار اسم الملف (في حال وجودها).
lpDirectory : اسم المجلد الذي يقع عليه الملف .. ويتم تمرير القيمة vbNullString (سلسلة محارف صفرية) في حال تم تمرير المسار كاملا إلى الوسيطة lpFile .
nShowCmd :مطابقة للوسيطة windowstyle التابعة للدالة Shell .
القيمة اللتي تعيدها الدالة:
تكون اكبر من 32 عندما تنجح العملية وعندما يحدث عكس ذلك فأن الدالة تعيد قيما أقل ويمكن تتبع مصدر الخطأ من خلال هذه القيم.

امثلة:

1- مثال لتشغيل ملفات تنفيذية..

'لاحظ انه دائما لاحاجة لتمرير مسار مجلد الويندوز

كود :
ShellExecute hwnd, "Open", "Calc.exe", _
vbNullString, vbNullString, 3
2- مثال لتشغيل ملفات مقترنة..
في هذا المثال سأوضح جملة من شيفرات الخطأ التي تصدر عن الدالة في حالة عدم النجاح ومالذي تعنيه كل قيمه..

كود :
Private Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation _
As String, ByVal lpFile As String, ByVal lpParameters _
As String, ByVal lpDirectory As String, ByVal nShowCmd _
As Long) As Long
Sub ShellDocument(FileName As String)
Dim Ret&
Ret = ShellExecute(hwnd, "Open", FileName, "", "", 1)
If Ret <= 32 Then
Select Case Ret
Case 2&
MsgBox "الملف غير موجود"
Case 3&
MsgBox "المسار غير موجود"
Case 5&
MsgBox "تعذر الوصول"
Case 8&
MsgBox "ذاكرة غير كافية"
Case 11&
MsgBox "هناك خلل في الملف التنفيذي"
Case 32&
MsgBox "مكتبة الربط غير موجودة"
Case 31&
MsgBox "لايوجد برنامج مقترن بهذا الامتداد"
Case Else
MsgBox "خطأ غير معرف في هذا المثال"
End Select
End If
End Sub
Private Sub Command1_Click()
ShellDocument "C:Test.txt"
End Sub
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  طريقة تشغيل فيجوال بيسك6 على وندوز7 ahmed3d 6 5,579 05-12-22, 06:49 AM
آخر رد: Ergheegh2022
  شرح طريقة تشغيل SkinCrafter على vb6 ولد رائع 8 6,632 23-02-22, 10:21 AM
آخر رد: ahmedchemist
  أرضية تسجيل الملفات المساعدة و اقصد dll or tlb or ocx سعود 0 1,886 27-08-19, 10:09 PM
آخر رد: سعود
  من المنتدى القديم - للمبتدئين كل ما تريد معرفته عن الوقت والتاريخ والأدوات المتعلقة RaggiTech 1 3,657 06-03-15, 04:29 AM
آخر رد: abulayth
  أداة CamTools تشغيل الكام عن طريق الفورم RaggiTech 0 3,047 15-10-12, 10:25 AM
آخر رد: RaggiTech
  من المنتدى القديم - الأخطاء البرمجية RaggiTech 0 4,737 14-10-12, 01:57 PM
آخر رد: RaggiTech
  من المنتدى القديم - السلسلة الذهبية ... تمرير باميترات إلى داخل البرنامج من الويندوز RaggiTech 1 2,517 14-10-12, 01:54 PM
آخر رد: RaggiTech
  من المنتدى القديم - عمل امتداد ملفات خاص بك RaggiTech 1 2,789 14-10-12, 01:46 PM
آخر رد: RaggiTech
  من المنتدى القديم - كائن الطباعة للمبتدئين RaggiTech 0 2,798 14-10-12, 01:44 PM
آخر رد: RaggiTech
  من المنتدى القديم - كيفية عمل Setup باستخدام Setup Factory RaggiTech 0 2,817 14-10-12, 01:43 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم