DuplicateHandle () ، استخدم في الأولى أو الثانية ؟

StackOverflow https://stackoverflow.com/questions/819710

  •  03-07-2019
  •  | 
  •  

سؤال

Windows API DuplicateHandle() http://msdn.microsoft.com/en-us/library/ms724251(مقابل.85).aspx يتطلب التعامل مع كائن إلى أن تكرار مؤشر إلى كل من العملية الأصلية وغيرها من العملية التي تريد استخدامها تكرار التعامل مع في.

وأنا على افتراض أنه إذا كان لدي اثنين لا علاقة لها العمليات ، DuplicateHandle() في أحد طالما كان المطلوب مقابض المتاحة ؟

سؤالي هو حول استخدام الأنابيب التواصل بين العمليتين لتحقيق هذا مع الحدث.

في أول عملية CreateEvent().الآن أريد أن استخدام WaitForSingleObject() في العملية الثانية.

إذا كنت في محاولة لتكرار التعامل في العملية الأولى, سوف تحتاج إلى إرسال أول ثاني عملية التعامل مع أول عملية عبر الأنابيب ، مكررة المقبض ثم أرسل التعامل مع أكثر من الثاني ؟

Alternativly, أنا يمكن أن تبدأ من خلال إرسال أول عملية التعامل مع الحدث التعامل مع عملية الثاني ومجرد تكرار ذلك هناك.

هل هناك سبب يجب اختيار واحد على الآخر ؟

إضافة التجاعيد الحدث التعامل مع الواقع الموروثة من الوالدين العملية التي تسمى في الواقع أول عملية (وهو تطبيق CGI).إذا كان هذا الحدث التعامل مع أنشئت مع HANDLE_DO_NOT_DUPLICATE (شيء من هذا القبيل) ثم يمكنني في الواقع استخدام DuplicateHandle() إلى أنها مكررة للمرة الثانية ؟

الرد:

حسنا أنا قد خلق جديد اسمه الحدث في أول عملية العثور عليه في العملية الثانية كما اقترح, ولكن أنا أحاول أن تكرار الأحداث التي تم إنشاؤها في الأصل من أول عملية foreward الثانية من العملية.هذا الحدث ليس اسمه الحدث لذلك أنا بحاجة إلى استخدام DuplicateHandle().

أنا باستخدام الأنابيب IPC.أنا أدرك أن DuplicateHandle() أن في العملية الأولى لأن الحدث مقبض خارج السياق عندما أرسلت إلى العملية الثانية.

        hProcPseudo  = GetCurrentProcess() 

    //Then call either:
        lpRealHandle = OpenProcess( PROCESS_DUP_HANDLE, 0, hProcPseudo ) 
//This fails with GetLastError= 87 - The parameter is incorrect ???
// same thing with PROCESS_ALL_ACCESS ??


    //OR
        lRet = DuplicateHandle( hProcPseudo, hProcPseudo, hProcPseudo, lpRealHandle, DUPLICATE_SAME_ACCESS, 0, 0 )

    //then I can Duplicate my Event Handle in the first thread with:
        lRet = DuplicateHandle( hLocalProcess, hEvent, lpRealHandle, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)

ثاني عملية تحويل مقبض مع DuplicateHandle() المفصل أعلاه تحويل

hProcPseudo= 4294967295

إلى

hProcess= 152

ثم تمر هذه العملية التعامل مع أول عملية من خلال توجيه الإخراج المسمى.في العملية الأولى (حيث الحدث المقبض صالح) أنا دعوة مكررة التعامل مع:

DuplicateHandle( hFirstProcess, hEvent, hSecondProc, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)

للأسف تظهر لي رسالة خطأ:

DuplicateHandle hPipeFCGI GetLastError= 6 - مقبض غير صالح.

مزيد من التجارب (استبدال hFirstProcess) يكشف فمن hSecondProc أنه غير صالح!??

اللغز الكبير.

هل كانت مفيدة؟

المحلول

واستخدام اسمه الأنابيب أو < وأ href = "http://msdn.microsoft.com/en-us/library/aa365576(VS.85).aspx" يختلط = "نوفولو noreferrer"> mailslots للIPC، وهذا يجب أن تعمل بشكل موثوق لجهودكم هدف. إذا كنت في حاجة إلى الانتظار، استخدم اسمه مقابض الانتظار.

وإلا، فما استقاموا لكم فاستقيموا تختار القيام DuplicateHandle في العملية الثانية من أجل تعيين ملكية التعامل بشكل صحيح.

نصائح أخرى

والتعامل مع عملية يختلف عن معرف العملية. OpenProcess يأخذ معرف العملية. استخدام شيء من هذا القبيل ...

ومقبض hProcess = OpenProcess (PROCESS_DUP_HANDLE، FALSE، GetCurrentProcessId ())؛

إذا فهمت بشكل صحيح، وتريد أن تزامن عمليتين لا علاقة لها من خلال نفس الحدث. إذا كان الأمر كذلك، يمكنك استخدام اسمه الأحداث.

إنشاء باستخدام CreateEvent وظيفة API واحد ، وتوفير اسما، ثم من استخدام عملية الثاني OpenEvent وظيفة API ، تحديد اسم الحدث.

لديك وظائف مماثلة لكائنات المزامنة أخرى، مثل كائنات المزامنة (<لأ href = "http://msdn.microsoft.com/en-us/library/ms684315(VS.85).aspx" يختلط = "نوفولو noreferrer "> OpenMutex ) أو الإشارات ( OpenSemaphore ) .

  1. بطريقة أو بأخرى ، والثاني العملية تحتاج إلى الحصول على معرف العملية أن العملية الأولى.هذا ويمكن الحصول عليها من خلال GetCurrentProcessId()
  2. العملية الأولى الآن يحتاج إلى استخدام هذا الرقم للحصول على HANDLE أن العملية الثانية: hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId);
  3. الآن يمكنك تكرار التعامل في أول عملية باستخدام عملية حقيقية مقبض العملية الثانية و الزائفة مقبض العملية الأولى: DuplicateHandle(GetCurrentProcess(), hEvent, hProcess, &hDupEvent, 0, FALSE, DUPLICATE_SAME_ACCESS);
  4. تذكر أن الإفراج عن المقبض الذي قمت بإنشائه مع OpenProcess في النهاية (أنا لا أعرف ما الفرق الذي من شأنه أن يجعل لكن من المفترض أنك...).كما سراح كل من يتعامل مع الحدث:واحد بالنظر إلى العملية الثانية و الأولى في التعامل معها.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top