كيف تحدد متى تكون العملية جاهزة؟ (باستخدام CreateProcess () و bindwindow ())
-
29-09-2019 - |
سؤال
يجب أن يكون هذا سهلاً: أقوم بإنشاء برنامج يولد عملية باستخدام Win32 CreateProcess()
وظيفة. بمجرد تحميل هذه العملية ، أجد نافذتها باستخدام FindWindow
وأرسلها رسائل باستخدام SendMessage()
. السؤال هو، كيف أعرف عندما تكون تلك النافذة جاهزة لقبول الرسائل؟
النظر في ما يلي:
HWND wnd;
BOOL Start()
{
// Spawn the process
if (! CreateProcess(...))
return FALSE;
// Find the process's window (class and name already known)
wnd = FindWindow(MY_WINDOW_CLASS, MY_WINDOW_NAME);
// Always returns FALSE because window has not yet been created.
return (wnd != NULL);
}
الرمز أعلاه سيفشل (تقريبًا؟) دائمًا ؛ لا يمكن إنشاء النافذة وتجد ذلك بسرعة. إذا وضعت موضوع انتظر ، قل Sleep(1000)
, ، بين ال CreateProcess
و FindWindow
المكالمات ، فهي تعمل بشكل جيد. لكن هذا يبدو وكأنه أ جداً اختراق سيء.
كيف يمكنني تحسين هذا؟
المحلول
(يحرر): مستخدم iinsable أشار المشاكل مع WaitForInputIdle()
, ، واقترح خطافات CBT في حين أن.
(...) وظيفة رد الاتصال المستخدمة مع Setwindowshookexوظيفة. يستدعي النظام هذه الوظيفة قبل التنشيط ، وإنشاء ، (...) نافذة ؛ (... أشياء كثيرة أخرى).
أيضا ، CBT قصير للتدريب القائم على الكمبيوتر ، لأي سبب من الأسباب.
(قديم ، احذر ، انظر التعليقات.) أنت تبحث عن waitforinputidle (). يقتبس:
عندما تنشئ عملية الوالدين عملية طفل ، تعود وظيفة CreateProcess دون انتظار عملية الطفل لإنهاء تهيئتها. قبل محاولة التواصل مع عملية الطفل ، يمكن لعملية الوالدين استخدام وظيفة Waitforinputidle لتحديد متى تم إكمال تهيئة الطفل.
نصائح أخرى
هل نظرت إلى waitforinputidle?
إذا كانت العملية التي تبدأها هي عملية يمكنك تغييرها ، فاطلبها إرسال رسالة إلى الوالد عندما تكون جاهزة. يمكنك تمرير HWND من الوالد كمعلمة سطر الأوامر ، أو استخدام FindWindow
إذا كنت تستطيع ضمان أن يكون الوالد فريدًا.
أفترض أن الكود المصدري لكلا العمليتين يخضعون لسيطرتك.
- يمكنك السماح للعملية الثانية بنشر رسالة إلى الأولى عندما تكون جاهزة ، إذا كان الثاني يعرف التفاصيل المطلوبة لنافذة رسالة العملية الأولى.
- أو يمكنك الانتظار في العملية الأولى لكائن المزامنة المسمى ، مثل الحدث أو Mutex ، يتم تعيينه من العملية الثانية.