इंटरफ़ेस की विधि तालिका की शुरुआत के सापेक्ष एक इंटरफ़ेस विधि के बाइट ऑफसेट प्राप्त करने के लिए आप vmtoffset
असेंबलर निर्देश का उपयोग कर सकते हैं। उदाहरण के लिए System.pas में _IntfCast
के कार्यान्वयन पर एक नजर डालें,:
call dword ptr [eax] + vmtoffset IInterface.QueryInterface
...
call dword ptr [eax] + vmtoffset IInterface._Release
पहली अभिव्यक्ति 0 कहते हैं, दूसरा, 8.
हालांकि आप उन अभिव्यक्तियों को पैरामीटर नहीं कर सकते हैं। वे संकलन-समय स्थिरांक हैं, इसलिए आप यह नहीं चुन सकते कि आप किस समय पर चलाना चाहते हैं। आपको पहले से प्रदर्शित सभी संभावित विधि नामों की आवश्यकता है।
आप सभी वास्तव में को हुक करने की आवश्यकता है QueryInterface
। एक बार आपके पास हो जाने के बाद, आप जो भी प्रॉक्सी ऑब्जेक्ट चाहते हैं उसे वापस कर सकते हैं जो सभी अन्य तरीकों से कॉल को रोक सकता है।
स्रोत
2010-07-02 05:07:12
डेल्फी सभी रक्तमय कॉम विवरण का एक बहुत दूर ले जाता प्राप्त करने के लिए, मुझे लगता है कि आप जिस तरह से अपने आप को बहुत ज्यादा करना चाहते हैं। आप क्या हासिल करने का प्रयास कर रहे हैं? अपना स्वयं का COM सर्वर बनाना या मौजूदा का उपयोग करना? –
क्या आप इंटरफ़ेस में विधि की संख्यात्मक ऑफ़सेट चाहते हैं (उदाहरण के लिए, IUnknown.QueryInterface 0 है), कक्षा में विधि का पता जो उस इंटरफ़ेस विधि को लागू करता है (उदाहरण के लिए, @ TInterfacedObject.QueryInterface), या पते का पता एक इंटरफ़ेस कॉल को संबंधित ऑब्जेक्ट विधि से जोड़ने के लिए जेनरेट किया गया स्टब कोड? उत्तरार्द्ध कक्षा की इंटरफ़ेस तालिका में संग्रहीत है। –
@The_Fox: न तो: मैं Win32Hook.pas का उपयोग कर बाहरी COM ऑब्जेक्ट पर कॉल को रोक रहा हूं। @ रोब केनेडी: कोई TInterfacedObject क्लास नहीं है - मेरे पास केवल बाहरी डीएल द्वारा कार्यान्वित एक इंटरफ़ेस है। –