2009-10-22 19 views
7

मैं कॉम रोकना CoCreateInstanceEx और/या CoGetClassObject कार्यों एक इकाई परीक्षण में एक परीक्षण शिम के साथ एक वर्ग को बदलने के लिए चाहते हैं। यह केवल एक सीएलएसआईडी के लिए होगा; अन्य सभी अपरिवर्तित के माध्यम से जा सकते हैं। क्या भयानक, बुराई हैक्स के बिना ऐसा करने का कोई तरीका है?क्या CoGetClassObject और/या CoCreateInstance कॉल को हुक या अवरुद्ध करने का कोई तरीका है?

+1

शिकार: http://stackoverflow.com/questions/1505196/spying-on-com-objects –

+0

@Shay, वास्तव में यह है। मैंने इसे डुप्ली के रूप में बंद करने के लिए वोट दिया है, लेकिन स्पष्ट रूप से यह पर्याप्त नहीं है कि केवल प्रश्नकर्ता वोट-टू-क्लोज़ (मैं हटाना नहीं चाहता, क्योंकि यह भविष्य में किसी की खोज में मदद कर सकता है) – bdonlan

+0

डुप्लिकेट नहीं । यह सवाल COM वस्तुओं पर जासूसी कर रहा है। यह सवाल यूनिट परीक्षण के लिए है। CoCreateInstance को हुक करके समस्या को हल करने के पूर्व प्रयास - जिसका मतलब यह नहीं है कि इसका जवाब होना चाहिए। यह सवाल CoCreateInstance को हुक करना चाहता है। –

उत्तर

2

यह वास्तव में क्या आप चाहते हैं पर निर्भर करता है।

आप पता लगाने के लिए जो उस वर्ग लोड कर रहा है या क्या यह सब आप Process Monitor उपयोग कर सकते हैं पर लोड किया जाता है पता लगाना चाहते हैं। CoGetClassObject() (या CoCreateInstanceEx()) करने के लिए एक कॉल के लिए नेतृत्व करेंगे एक HKCR\CLSID\{Class of interest id} कुंजी जा रहा है पढ़ सकते हैं और प्रक्रिया की निगरानी आपको बताएंगे कि क्या प्रक्रिया है और इस और कैसे सफल यह है करता है जब।

तुम अपने साथ एक मौजूदा वर्ग बदलना चाहते हैं - एक ही कक्षा आईडी के साथ वर्ग के अपने संस्करण के साथ एक पुस्तकालय संकलन और HKCR\CLSID\{Class of interest id} ताकि अपने पुस्तकालय के साथ एक वर्ग की सेवा के लिए प्रयोग किया जाता है अंदर COM सर्वर के लिए पथ बदल आईडी। आप इसे मैन्युअल रूप से या regsvr32 के साथ कर सकते हैं - पहले मूल लाइब्रेरी पंजीकृत करें, फिर ब्याज रजिस्ट्रेशन के वर्ग को ओवरराइड करने के लिए। COM क्लास आईडी करता है -> उस कुंजी के माध्यम से लाइब्रेरी मैपिंग जब उपभोक्ता CoGetClassObject() या CoCreateInstanceEx() पर कॉल करता है।

+0

दुर्भाग्यवश, मैं इसके लिए रजिस्ट्री के साथ गड़बड़ नहीं कर सकता - यह स्वचालित परीक्षण सूट पर चलाएगा, और जिस कक्षा में मैं ओवरराइड करना चाहता हूं वह 'CLSID_KnownFolderManager' है, इसलिए शायद इसे ओवरराइड करना एक बुरा विचार है एक प्रणाली-व्यापी तरीके :) सबसे बुरे मामले में, मैं परीक्षण करने के लिए कोड का वाद्य यंत्र कर सकता था, लेकिन अगर इसे एक प्रक्रिया के लिए बदलने का एक साफ तरीका है, तो यह अच्छा होगा। – bdonlan

+1

सबसे पहले, परीक्षण सूट चलाने के बाद आप मूल लाइब्रेरी को पंजीकृत कर सकते हैं और यह सैनिटी को पुनर्स्थापित करेगा। दूसरा, आप केवल वर्तमान उपयोगकर्ता के लिए अपनी संशोधित लाइब्रेरी पंजीकृत कर सकते हैं - HKCU \ Software \ Classes \ CLSID को संशोधित करें। इसके अलावा आप कुछ भी कम या कम सुरुचिपूर्ण नहीं कर सकते हैं। – sharptooth

3

वहाँ हमेशा CoTreatAsClass समारोह है: http://msdn.microsoft.com/en-us/library/ms693452(VS.85).aspx

लेकिन, जैसा कि आप का उल्लेख किया है, यह वर्ग का एक सिस्टम-वाइड प्रतिस्थापन, नहीं एक स्थानीय बदलाव किया जाएगा।

वैकल्पिक रूप से, आप CoCreateInstance hooking के रूप में पद शे Erlichmen की टिप्पणी से संदर्भित में सुझाव पर गौर कर सकता है।

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

  • कोई संबंधित समस्या नहीं^_^