मैं जो निम्नलिखित कोड का उपयोग कर देशी डेल्फी dll कॉल एक सी # अनुप्रयोग है में सी # फोन करने वाले के लिए डेल्फी dll से एक स्ट्रिंग रिटर्निंग:64 बिट
सी #
[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern int GetString(string out str);
डेल्फी
function GetString(out a: PChar): Integer; stdcall;
begin
a := PChar('abc');
Result := 1;
end;
जो 32 बिट एप्लिकेशन में ठीक काम करता है। लेकिन जब मैं 64 बिट के लिए सी # एक्सई और डेल्फी डीएल दोनों संकलित करता हूं तो मुझे एक अजीब समस्या मिलती है। डेल्फी डीबगर में गेटस्ट्रिंग को कॉल करने के बाद मैं देख सकता हूं कि .NET कोड में कहीं भी अपवाद उठाया गया है और निम्न स्ट्रिंग डीबगर आउटपुट विंडो में दिखाई देती है: "गंभीर त्रुटि का पता चला c0000374"। Google कहता है कि यह त्रुटि ढेर भ्रष्टाचार से संबंधित है। मैंने बाहर/बाहर की बजाय रेफ/var पैरामीटर संशोधक का उपयोग करने का प्रयास किया। अभी भी कोई भाग्य नहीं है। मुझे यह त्रुटि क्यों मिलती है? क्या मुझे 64 बिट के लिए एक अलग कॉलिंग सम्मेलन का उपयोग करना चाहिए?
बीटीडब्ल्यू। निम्नलिखित संयोजन ठीक काम करता है:
सी #
[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern string GetString(string a);
डेल्फी
function GetString(a: PChar): PChar; stdcall;
var
inp: string;
begin
inp := a;
Result := PChar('test ' + inp);
end;
ठीक काम करता है। लेकिन मुझे एक स्ट्रिंग को आउट पैरामीटर के रूप में वापस करने की आवश्यकता है।
आपको बहुत बहुत धन्यवाद! आपने मुझे इस समस्या से लड़ने के कई घंटे बचाए। – Max
'पीसीहर'? मौका का खेल यह 'पंसिहर' या 'पीवाइडकर' था? (हाँ, हम इसे 64-बिट XE2 को घटा सकते हैं, लेकिन हम यह सुनिश्चित नहीं कर सकते कि यह कोड 64-बिट एफपीसी के साथ संकलित नहीं किया जाएगा या 32-बिट प्रोजेक्ट आदि में कॉपी-पेस्ट नहीं किया जाएगा) –
@ एरियोच 'फिर' PWideChar 'का उपयोग करें आप चाहें तो। –