2010-02-04 15 views
5

से डेल्फी डीएलएल विधि को कॉल करना मैं सी # एएसपी.नेट कोड से डेल्फी फ़ंक्शन को कॉल करने का प्रयास कर रहा हूं। समारोह की घोषणा इस तरह दिखता है:सी # कोड

function SomeFunction(const someString, SomeOtherString: string): OleVariant; 

मेरी सी # कोड से मैं इस कोड है:

[DLLImport(MyDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] 
public static extern object SomeFunction(string someString, string SomeOtherString); 

हर बार जब मैं इस विधि फोन और एक वस्तु के रूप में संग्रहीत, मैं एक पी/आह्वान त्रुटि मिलती है । मैंने पहले कभी अपने सी # से अप्रबंधित कोड नहीं कहा है, इसलिए मैं एक नुकसान में हूं।

+0

आपको प्राप्त होने वाली पी/आमंत्रण त्रुटि क्या है? =) – Rob

+0

आपको अपने फ़ंक्शन को "निर्यात" और "stdcall" के रूप में न्यूनतम रूप से चिह्नित करने की आवश्यकता है। अपना यूनिट कोड दिखाएं जहां यह फ़ंक्शन निर्यात किया जाना परिभाषित किया गया है। –

+0

[इस FAQ का संदर्भ लें जिसे मैंने कुछ दिनों पहले टेक-टिप्स फ़ोरम (मुझे क्लिक करें) पर लिखा था] (http://tek-tips.com/faqs.cfm?fid=7416) –

उत्तर

9

आप कि DLL फ़ंक्शन को कॉल नहीं कर सकते क्योंकि यह डेल्फी विशेष string डेटा प्रकार, जो गैर Embarcadero उत्पादों में कोई समकक्ष है उपयोग करता है।

आप की क्षमता है (यहां तक ​​कि अगर अपने सी # कोड डेल्फी के स्ट्रिंग प्रकार की संरचना मिलान कर सकते हैं, आप भी DLL की स्मृति प्रबंधक है, जो यह लगभग निश्चित रूप से निर्यात नहीं करता है का उपयोग कर स्मृति को आबंटित करने की आवश्यकता होगी।) डीएलएल को बदलने के लिए, पैरामीटर को पेंसिखर या पीडब्ल्यूआईडीएचआर टाइप करें। (आपके सी # घोषणा से, ऐसा लगता है कि आप पेंसिहर चाहते हैं।) यही है कि डीएलएल ने सभी के साथ क्या उपयोग किया होगा।

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

0

[DLLImport(MyDLL.dll, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] 
public static extern IntPtr SomeFunction(string someString, string SomeOtherString); 

की कोशिश करो और एक .NET ऑब्जेक्ट प्राप्त करने के लिए वापसी मान के साथ Marshal.GetObjectForNativeVariant का उपयोग करें।