السلام عليكم
أقوم بعمل برنامج ينفذ برنامج خارجي ولكن لاأريد أن يتم تنفيذ الكود الذي يلي أمر تشغيل البرنامج الخارجي حتى يتم إنهاء ذلك البرنامج الذي تم تشغيله
حاولت باستخدام الأمر Shell وكذلك الأمر CreateProcess بدون فائدة
السلام عليكم
أقوم بعمل برنامج ينفذ برنامج خارجي ولكن لاأريد أن يتم تنفيذ الكود الذي يلي أمر تشغيل البرنامج الخارجي حتى يتم إنهاء ذلك البرنامج الذي تم تشغيله
حاولت باستخدام الأمر Shell وكذلك الأمر CreateProcess بدون فائدة
عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه
نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا
ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا
محمد سامر أبو سلو
طيب اكتب الكود المستخدم حتي يتثني للاعضاء تصحيحه
redahashem
رضا هاشم
اللهم اصلح امورالمسلمين
سبحان الله وبحمده سبحان الله العظيم
اللهم اهلك من سبب في فرقتنا وسفك دمائنا وزاد همنا وكربنا
أفتح مشروع جديد وأضف بالفورم : تايمر و كوماند
و إلصق الكود التالي:
وإذا كان أحد عنده طريقة غير هذه فليتفضل يكتبها.
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Sub Form_Load() Timer1 = False Timer1.Interval = 500 'أو أكتبها في خصائص تايمر1 End Sub Private Sub Command1_Click() 'هنا فتح أو تشغيل الملف الثاني Shell "C:\22.exe", vbNormalFocus 'هنا أكتب مسار برنامجك الثاني مثل C:\22.exe Dim hwnd As Long 'هنا عملية البحث عن مقبض البرنامج الثاني حتى يفتح hh: DoEvents 'هنا أي أنك تقول للنظام نفذ الكود التالي لكي لا يدخل برنامجك بدوامة جمود hwnd = FindWindow(vbNullString, "هنا ضع عنوان البرنامج الثاني حرفياً") 'عنوان البرنامج هو الذي يظهر في البروسس أي العمليات والتطبيقات (أي عندما ثقوم بإنهاء المهمة ) If hwnd = 0 Then GoTo hh: Timer1 = True End Sub Private Sub Timer1_Timer() Dim hwnd As Long 'هنا العملية معاكسة أي أنك تريد أن تعرف أن المقبض مازال أم لا hwnd = FindWindow(vbNullString, "هنا ضع عنوان البرنامج الثاني حرفياً") If hwnd <> 0 Then Exit Sub 'هنا ضع الكود التالي بعد إغلاق البرنامج الثاني 'مثل MsgBox "تم تفعيل الكود بعد إغلاق البرنامج الثاني" Timer1 = False End Sub
بكل بساطة الكود المستخدم
dim comnd as string cmnd = "calc.exe" shell cmnd ... rerst of code execution
ولكن لا أريد تنفيذ ... rerst of code execution قبل أن يتم إنهاء البرنامج الذي تم تشغيله بواسطة الأمر shell
عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه
نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا
ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا
محمد سامر أبو سلو
الاخ العزيز msas الموضوع ليس كيف تشغل برنامج من داخل تطبيقك -_- .. الموضوع الذي يقصده السائل هو امر يستند على ما بعد العملية التي يقوم بها البرنامج الذي تم استدعائه من داخل الكود بواسطة Shell .
اقول للاخ السائل بالنسبة لي استخدم التالي:
اضع الملف المراد تنفيذه في ملف باتش واقوم باستدعاء هذا الملف بواسطة الــ Shell طبعا يمكنك انشاء هذا الملف داخل الكود ليتعرف على المسارات :
ExtrnalProgram dir c:\*.* > A
مالذي يحصل هنا الذي يحصل هنا انه سيتم تنفيذ الباتش بواسطة الامر Shell ويقوم الباتش بتنفيذ الامر الاول وهو تشغيل البرنامج الخارجي واذا انتهت العمليات التي يقوم بها البرنامج الخارجي يقوم تنفيذ الامر الثاني ارسال عرض جميع الملفات في القرص C ووضعها في ملف A
في داخل الكود الخاص بي بعد عملية الــ Shell
اضع لوب لاينتهي حتى يصبح الملف A موجود تحت المسار C عندها يقوم بتنفيذ الاوامر التي ارغب في تنفيذها .
ولزيادة التوضيح :
Public Sub Create_Batch_File(ProgramName as String) Dim LOCL_FileNum As Integer LOCL_FileNum = FreeFile If Len(Dir(App.Path & "\A")) > 0 Then Kill App.Path & "\A" Open App.Path & "\batch.bat" For Output As #LOCL_FileNum Print #LOCL_FileNum, ProgramName Print #LOCL_FileNum, "dir c:\*.* > " & App.Path & "\A" Close #LOCL_FileNum Shell App.Path & "\batch.bat", vbHide While Dir(App.Path & "\A", vbNormal) = "" Wend End Sub
ويمكنك استدعاء العمليه الفرعيه هذه من اي مكان في البرنامج الخاص بك كالتالي :
Create_Batch_File " هنا تضع مسار واسم البرنامج الخارجي مع امتداد الملف طبعا" هنا تضع الاوامر التي تنتظر الانتهاء من تنفيذ عمليات البرنامج الخارجي ............. ................. .....................
تم تعديل هذه المشاركة بواسطة العقده في 26 نوفمبر 2006 في 23:13
ليس كل ما يتمناه المرء يدركه

العقده كتب:الاخ العزيز msas الموضوع ليس كيف تشغل برنامج من داخل تطبيقك -_- .. الموضوع الذي يقصده السائل هو امر يستند على ما بعد العملية التي يقوم بها البرنامج الذي تم استدعائه من داخل الكود بواسطة Shell .
أخي لو أنك تأكدت من اسم السائل لوجدت أنه سؤالي وأنا أوضح ما أريد وجوابك ليس ما أريد أنا استطيع التحكم بتسلسل الأوامر من خلال الباتش بالدوس ولكن هناك عمليات معالجة ستتم في البرنامج بعد إنتهاء البرنامج الذي سيتم تشغيله بواسطة الأمر shell في مثالي وأريد أن اعرف متى يقوم المستخدم بإنهاء البرنامج الخارجي حتى أستطيع متابعة المعالجة من ضمن برنامجي
عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه
نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا
ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا
محمد سامر أبو سلو
كنت عامل مثالين قديما تجدهم هنا
Detecting the exit of specific Process, With API and WMI
ولكن يبدو أن معظم المرفقات القديمة قد ذهبت ..
علي العموم مرفق كود مبسط يبين كيفية عمل ذلك ..
فقط لا تنسي أن تضع اي ملف Exe علي اامسار C:\Test.exe
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Const STILL_ACTIVE As Long = &H103
Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Private Sub Command1_Click()
Dim lngHandle As Long, lngExit As Long, ProcID As Long
If Dir("C:\Test.exe") = vbNullString Then Exit Sub
Proc = Shell("C:\Test.exe", vbNormalFocus)
lngHandle = OpenProcess(PROCESS_ALL_ACCESS, False, Proc)
GetExitCodeProcess lngHandle, intExit
Do While intExit = STILL_ACTIVE
DoEvents
GetExitCodeProcess lngHandle, intExit
Loop
MsgBox "process Ended"
End Subتم تعديل هذه المشاركة بواسطة Pharaonic_Guy في 27 نوفمبر 2006 في 09:44
أخ Pharaonic_Guy هذا ما أريد بالضبط جزاك الله خيرا
عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه
نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا
ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا
محمد سامر أبو سلو
ولكن أخيPharaonic_Guy (سؤال) أستعمال اللوب بشكل دائم لحين إغلاق البرنامج الثاني ألا يؤئرعلى ذاكرة النظام وسرعته.
Do While intExit = STILL_ACTIVE DoEvents GetExitCodeProcess lngHandle, intExit Loop
عبد العزيز اليوسفي كتب:ولكن أخيPharaonic_Guy (سؤال) أستعمال اللوب بشكل دائم لحين إغلاق البرنامج الثاني ألا يؤئرعلى ذاكرة النظام وسرعته.Do While intExit = STILL_ACTIVE DoEvents GetExitCodeProcess lngHandle, intExit Loop
لا أعتقد ذلك ولكن لتجنب توقف البرنامج عن الاستجابة نستخدم DoEvents لجعل النظام يتابع العمليات التي عليه القيام بها اثناء الدوران خلال الحلقة وهذا أفضل برأيي من استخدام timer لهذه العملية
وهناك نقطة إضافية لاحظ أن الويندوز بيئة متعددة المهام Multitasking وأن كل برنامج يتم تنفيذه على مسار Thread مستقل وبالتالي دخول الحلقة - افتراضيا - في دوامة لانهائية لن يؤثر إلا على ذلك البرنامج الذي تنفذ من خلاله ولتجنب حصول عدم استجابة لذلك المسار تم استخدام DoEvents
عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه
نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا
ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا
محمد سامر أبو سلو
مشكور أخي
لكن أنا أعرف DoEvents
ولكن أنا أقول أنه لو أستخدم تايمر كل 500 ميلي أفضل.
فإذا كنت متأكد من كلامك أي أن DoEvents و Do....Loop أفضل فيرجى التأكيد .
أو ننتظر من يعرف .
لا يمكنك قول أيهما أفضل فكل حالة قد تكون معالجتها مختلفة عن الأخرى
ولكن بخصوص السؤال هنا أعتقد أن حل الحلقة أفضل من أجل التسلسل المنطقي للكود
ثم أنه بجميع الأحوال البرنامج هنا متوقف عن المعالجة ريثما يتم إنهاء البرنامج الخارجي وربما نستخدم حل التايمر الذي تقترحه عندما نريد معالجة اشياء أخرى ريثما يتم إنهاء ذلك البرنامج الخارجي وبما أنك تتحدث عن موارد النظام أعتقد أن إطلاق حدث التايمر كل 500 ميللي ثانية سيكلف النظام أكثر من الحلقة بما أنك ستقوم بإطلاق حدث ثم معالجة ذلك الحدث باستخدام نفس كود الحلقة ثم ستنفذ إجراء إضافي يحتوي بقية كود المعالجة
عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه
نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا
ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا
محمد سامر أبو سلو
أخي الكريم أنت قلت (البرنامج هنا متوقف عن المعالجة ) فكيف يكون متوقف عن المعالجة ،يمكن أن تشرح إذا تفضلت
سبب قولي ان الرنامج متوقف عن المعالجة هو
إذا لاحظت في توضيح السؤال
اقتباسولكن هناك عمليات معالجة ستتم في البرنامج بعد إنتهاء البرنامج الذي سيتم تشغيله بواسطة الأمر shell في مثالي وأريد أن اعرف متى يقوم المستخدم بإنهاء البرنامج الخارجي حتى أستطيع متابعة المعالجة من ضمن برنامجي
أي أنه لايريد القيام بأي عمليات من داخل البرنامج حتى ينتهي البرنامج الآخر - ربما يكون في انتظار خرج ما من ذلك البرنامج ملف مثلا - وبهذا عمليا البرنامج سيكون بوضع الانتظار وواضح أنه لايريد القيام بأي شئ من برنامجه حتى انتهاء البرنامج الثاني
ولكن ذلك لايمنع في حالات أخرى من استخدام فكرتك بخصوص التايمر إن كنا نريد القيام بأمور أخرى ريثما يتم إنهاء البرنامج الثاني
وهنا أعود لعبارتي السابقة
اقتباسلا يمكنك قول أيهما أفضل فكل حالة قد تكون معالجتها مختلفة عن الأخرى
وبهذا فطبيعة البرنامج الذي نقوم بعمله ستفرض علينا إما استخدام طريقة الحلقة أو طريقة التايمر
عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه
نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا
ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا
محمد سامر أبو سلو
يا أخي بارك اللّه بك
أنت قلت أعتقد ( هنا أعتقد أن حل الحلقة أفضل من أجل التسلسل المنطقي للكود ) أي في الكود السابق.
أنا أريد جواب نهائي بدون إعتقاد- أدامك اللّه- أيهما أفضل في هذا المثال وفقط.
فإذا كنت متأكد فبارك اللّه بك .
تم تعديل هذه المشاركة بواسطة عبد العزيز اليوسفي في 28 نوفمبر 2006 في 01:15
في هذا المثال حل الحلقة أفضل بشكل مؤكد - من وجهة نظري -
عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه
نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا
ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا
محمد سامر أبو سلو
مشكور واللّه يعطيك العافية ويخليك.
هذا الموضوع مغلق.