2012-06-03 7 views
6

मैं एक COM इंटरफेस के साथ एक थर्ड पार्टी लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूँ। एक C++ नमूना आवेदन जो एक समारोह के रूप में घोषित उपयोग करता प्रदान की जाती है,: प्रकार पुस्तकालय आयात करने के बादक्यों आयातित प्रकार लाइब्रेरी फ़ंक्शन मूल स्रोत से भिन्न होता है?

HRESULT __stdcall IMyInterface::DoSomething (BSTR id, long State) 

, जिसके परिणामस्वरूप डेल्फी कोड है:

procedure DoSomething (const id: WideString; State: Integer); safecall; 

सी ++ नमूना आवेदन में, परिणाम (HRESULT) यह निर्धारित करने के लिए प्रयोग किया जाता है कि फ़ंक्शन को ठीक से निष्पादित किया गया था या नहीं।
डेल्फी इस घोषणा को एक प्रक्रिया में क्यों परिवर्तित करता है ताकि मुझे परिणाम न मिल सके?
इसे ठीक करने के लिए मैं क्या कर सकता हूं?

+0

कभी-कभी मुझे पता चला कि डेल्फी उत्पन्न टीएलबी गलत है। मैं जेनरेट की गई टीएलबी फ़ाइल को मैन्युअल रूप से संपादित करना समाप्त करता हूं। प्रक्रिया को प्रक्रिया में बदलने का प्रयास करें और देखें कि यह काम करता है या नहीं। – Hendra

+1

आपको इसकी जांच करने की आवश्यकता नहीं है, परिणाम का उच्च-बिट सेट होने पर डेल्फी अपवाद फेंकता है, यही कारण है कि प्रक्रिया को 'सुरक्षित' घोषित किया जाता है। [यह प्रश्न] देखें (http://stackoverflow.com/questions/96042/whats-safecall) और इसके उत्तर। –

+1

दूसरे विचार पर, कमांड प्रॉम्प्ट से tlibimp चलाने का प्रयास करें -Pt- विकल्प (-Pt- मानचित्र HRESULT सभी इंटरफेस (-T) पर सुरक्षित करने के लिए)। – Hendra

उत्तर

7

safecall कॉलिंग सम्मेलन बस HResult रिटर्न प्रकार का एक परिवर्तन है। यदि फ़ंक्शन गैर-सफलता देता है (S_OK या S_False के अलावा कुछ अन्य), तो यह एक अपवाद में फंस गया है और फेंक दिया गया है (या reSafeCallError रन-टाइम त्रुटि में बदल गया है, अगर SysUtils का कहीं भी उपयोग नहीं किया गया है)। विवरण के लिए System._CheckAutoResult देखें।

इसी तरह, आप एक safecall समारोह को लागू कर रहे हैं, किसी भी अपवाद पकड़ा है और अनुवाद एक HResult मूल्य में (E_Unexpected, जब तक TObject.SafeCallException कुछ और वापस जाने के लिए ओवरराइड है)। यह कैसे काम करता है के लिए System._HandleAutoException देखें।

यदि आप चाहें तो HResult लौटने वाले फ़ंक्शन में प्रक्रिया को वापस करने के लिए आपका स्वागत है। उस मामले में कॉलिंग सम्मेलन stdcall होना चाहिए। अपने उदाहरण का उपयोग करना:

function DoSomething(const id: WideString; State: Integer): HResult; stdcall; 
संबंधित मुद्दे