2013-03-29 11 views
7

हमारे पास एक ऐसी प्रणाली है जहां एक ही सिस्टम पर आम तौर पर दो प्रक्रियाएं चल रही हैं। एक प्रक्रिया जीयूआई और अन्य रनों को एक सेवा की तरह संभालती है (हालांकि ऐतिहासिक कारणों से, यह एक सेवा नहीं है, केवल कोई दृश्य विंडो नहीं है)।क्या प्रक्रियाओं के बीच पोस्टमेसेज को ट्रैक करना संभव है?

दो प्रक्रियाएं आईसीसी मुख्य रूप से पंजीकृत संदेशों के माध्यम से असीमित रूप से करती हैं - यानी हम दोनों प्रक्रियाओं में RegisterWindowMessage() का उपयोग उन संदेशों के बड़े सेट को परिभाषित करने के लिए करते हैं जो प्रभावी ढंग से सर्वर प्रक्रिया में एपीआई बनाते हैं।

मैंने एक "हैंड-फ्री" निगरानी अनुप्रयोग लिखा है जो SetWindowsHookEx() का उपयोग दोनों प्रक्रियाओं की संदेश कतारों की निगरानी और प्रदर्शित करने के लिए करता है और एपीआई का उपयोग करने के तरीके के बारे में कुछ स्तर का डिकोडिंग प्रदान करता है और नोटिफिकेशन कैसे प्रसारित किया जा रहा है जीयूआई प्रक्रिया (प्रत्येक व्यक्तिगत विंडो सीधे सर्वर से अधिसूचनाओं की सदस्यता ले सकती है)।

तो, दोनों दिशाओं में बड़ी संख्या में संदेश हैं इसलिए मेरे पास फ़िल्टरिंग और सारांश गणना आदि हैं इसलिए मैं विशेष गतिविधि पर ध्यान केंद्रित कर सकता हूं। यह सब लाइव कोड को प्रभावित किए बिना किया जा सकता है, जो कि अच्छा है।

यह सब अच्छी तरह से काम करता है, लेकिन अब यह GUI में उत्पन्न संदेश को "टैग" करने में सक्षम होने के लिए बहुत उपयोगी होगा, इसलिए सर्वर द्वारा संसाधित होने पर मैं उसी संदेश का पता लगा सकता हूं। यह सिस्टम समस्याओं को डीबग करने और निदान करने के लिए बेहद उपयोगी होगा, लेकिन मुझे हमारे पंजीकृत संदेश एपीआई में ऐसा समर्थन जोड़ने के बिना ऐसा करने का एक साफ तरीका नहीं मिल रहा है (वास्तव में मुझे कोई रास्ता नहीं मिल रहा है!), जो बहुत कुछ होगा काम के साथ और इस समय के साथ आराम से मुझे अधिक जोखिम शामिल है। यह इस तथ्य से और जटिल हो जाता है कि सर्वर कुछ संदेशों को पूर्व-संसाधित करता है और फिर कार्रवाई करने के लिए PostMessage() स्वयं को निष्पादित करता है, इसलिए मूल संदेश "खो गया" हो सकता है।

क्या किसी ने यहां इस प्रकार की समस्या का सामना किया है? यदि हां, तो क्या आप मुझे कुछ पॉइंटर्स दे सकते हैं? यदि नहीं, तो क्या Windows संदेश में डेटा का एक छोटा सा ब्लॉक जोड़ने और इसे बाद में पुनर्प्राप्त करने के लिए कोई दस्तावेज या अनियंत्रित तरीके हैं? मैंने SetMessageExtraInfo() पर देखा है लेकिन यह प्रति-संदेश की बजाय प्रति-पंक्ति है।

+0

यदि आपके पंजीकृत संदेशों में से कोई भी 'wParam' और' lParam 'दोनों का उपयोग नहीं करता है, तो आप वहां अपने टैग स्टोर कर सकते हैं। –

+0

धन्यवाद - लेकिन 'wParam' और' lParam' का अच्छी तरह से उपयोग किया जाता है :-(वास्तव में, एपीआई वास्तव में एमएमएफ में 'स्ट्रक्चर' के माध्यम से संदेशों में बहुत सारे डेटा पास करता है, यहां व्याख्या करने के लिए बहुत अधिक जानकारी है। उन 'स्ट्रक्चर' के साथ गड़बड़ करना चाहते हैं, जो समस्या है। –

+0

यह सिर्फ एक विकल्प नहीं है, वहां देखने से रोकें। –

उत्तर

1

FindWindow या FindWindowEx आपको जीयूआई विंडो का विवरण देगा। संदेश के साथ विवरण की तुलना करें

+0

ठीक है, मैं दोनों एचडब्ल्यूएनडी जानता हूं, लेकिन एमएसजी में कुछ भी नहीं है संरचना जिसे मैं स्रोत से लक्ष्य में जोड़ने के लिए तुलना कर सकता हूं। जीयूआई विभिन्न कारणों से कई संदेश भेज रहा है (जैसे उपयोगकर्ता कमांड, टाइमर इत्यादि) और एमएसजी सामग्री समान है। मुझे प्रत्येक मूल संदेश के लिए अलग से ट्रैक करने की आवश्यकता है। –

+0

जब तक कि हम संदेश में अतिरिक्त जानकारी नहीं जोड़ते, मूल को समझना असंभव है। – Jack

+0

यह सही है - इसलिए मेरा प्रश्न ;-) मैं ट्रैकिंग जानकारी को शामिल करने के लिए हमारी एपीआई नहीं बदलूंगा क्योंकि इसका उपयोग तीसरे पक्ष द्वारा किया जाता है। मैं संभवतः एक संदेश "टैगिंग" के अनियंत्रित तरीके से देख रहा था - मुझे लगता है कि ऐसी चीज मौजूद नहीं है, लेकिन मैं आभारी हूं कि आपने मदद करने की कोशिश करने में कुछ समय बिताया है, इसलिए वैसे भी +1 करें। –

संबंधित मुद्दे