2012-04-14 7 views
13

मैं इन सवालों का जवाब देता पढ़ सकते हैं औरमैं डेल्फी कक्षा की निजी विधि कैसे पैच कर सकता हूं?

How to change the implementation (detour) of an externally declared function

Patch routine call in delphi

लेकिन मैं बाहर figere नहीं कर सकते कि anoher इकाई में स्थित एक वर्ग का एक निजी विधि पैच है।

इस नमूना को जांचें मैं Bar प्रक्रिया को पैच करना चाहता हूं।

Unit ThidParty; 
Interface 
    Type 
     TFoo =Class 
     private 
      procedure Bar; 
     end; 

मुझे लगता है कि कुंजी को निजी विधि का पता प्राप्त करने का तरीका क्या है।

तो, मैं डेल्फी कक्षा की निजी विधि कैसे पैच कर सकता हूं?

+0

AFAIK यह संभव नहीं है क्योंकि निजी विधियां/प्रक्रिया वीएमटी का हिस्सा नहीं है और इस प्रकार आरटीटीआई आदि के माध्यम से उपलब्ध नहीं है। यह हैक करना संभव हो सकता है लेकिन इसके लिए आपको अन्य इकाई को अलग करने की आवश्यकता होगी और फिर कुछ पॉइंटर अंकगणित प्लस कुछ असेंबली वहां पहुंचने के लिए ... – Yahia

+0

यह भी देखें [डेल्फी कक्षा की सख्त संरक्षित संपत्ति तक पहुंचें?] (http://stackoverflow.com/a/8330615/576719)। डेविड द्वारा वर्णित क्लास हेल्पर्स। –

उत्तर

22

नीचे उल्लिखित समाधान डेल्फी सिएटल तक के संस्करणों के लिए काम करता है। आप वर्ग दरार करने के एक class helper उपयोग कर सकते हैं:

Unit1

type 
    TTest = class 
    private 
    procedure Foo; 
    end; 

Unit2

type 
    TMyTestHelper = class helper for TTest 
    function GetFooAddress: Pointer; 
    end; 

function TMyTestHelper.GetFooAddress: Pointer; 
var 
    MethodPtr: procedure of object; 
begin 
    MethodPtr := Self.Foo; 
    Result := TMethod(MethodPtr).Code; 
end; 

function FooAddress: Pointer; 
begin 
    Result := TTest(nil).GetFooAddress;//don't need to instantiate an object 
end; 

अपने पैचिंग कार्यों में से एक के लिए FooAddress से वापसी मान दर्रा और आप कर रहे हैं स्वर्ण।

हालांकि, डेल्फी 10.1 बर्लिन से शुरू होने पर, यह अब काम नहीं करता है! कक्षा सहायक अब सख्त संरक्षित, सख्त निजी या निजी सदस्यों तक नहीं पहुंच सकते हैं। यह "फीचर" वास्तव में एक कंपाइलर बग था जिसे एम्बरकेडेरो अब बर्लिन में तय कर चुका है। आप भाग्य से बाहर हैं।

+0

बहुत बहुत धन्यवाद डेविड। – Salvador

+2

क्या यह संकलक में एक छेद नहीं है? अगर यह तय हो जाता है तो क्या होगा? –

+0

@Andreas यह डिजाइन द्वारा मुझे लगता है। क्लास हेल्पर्स का मतलब निजीकरण तक पहुंच है। यदि यह 'निश्चित' हो जाता है तो आपको निजीकरण को तोड़ने के लिए अन्य साधनों का उपयोग करना होगा। –

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

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