पहली बात करने की ज़रूरत सी # तरफ stdcall
उपयोग करने के लिए है:
[DllImport("DLL.dll", CallingConvention=CallingConvention.StdCall,
CharSet=CharSet.Auto)]
मैं यह भी सुनिश्चित करें कि डेल्फी पक्ष पद डेल्फी 2009 है और इतने विस्तृत वर्णों का उपयोग करता रहना चाहता हूँ चाहते हैं। यदि ऐसा है, तो वहां कोई समस्या नहीं है। यदि आप गैर-यूनिकोड डेल्फी का उपयोग कर रहे हैं तो आपको CharSet.Ansi
की आवश्यकता होगी।
मैं शायद यह भी डेल्फी तरफ एक LongBool
लौट सकते हैं और
[return: MarshalAs(UnmanagedType.Bool)]
नेट तरफ पीठ के साथ यह मार्शल चाहते हैं।
अंत में, निश्चित लंबाई सरणी को अलग-अलग marshalled की जरूरत है। निश्चित लंबाई वर्ण सरणी के लिए मानक दृष्टिकोण .NET पक्ष पर StringBuilder
का उपयोग करना है जो आपकी इच्छानुसार मार्शल किया गया है।
इसे पूरी तरह लाना है, और अपने डेल्फी वाक्य रचना फिक्सिंग, देता है:
डेल्फी
type
TFixedLengthArray = array [1..200] of char;
function Get_Matrix(var Matrix: TFixedLengthArray): LongBool; stdcall;
सी #
[DllImport("DLL.dll", CallingConvention=CallingConvention.StdCall,
CharSet=CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool Get_Matrix(StringBuilder Matrix);
static void Main(string[] args)
{
StringBuilder Matrix = new StringBuilder(200);
Get_Matrix(Matrix);
}
अंत में, सुनिश्चित करें कि आप अशक्त-समाप्त कर अपने स्ट्रिंग जब आप इसे अपने डीएलएल से वापस करते हैं!
स्रोत
2011-02-24 13:52:25
हाय, समस्या अभी भी है। यह "चार सरणी" के सापेक्ष प्रतीत होता है, जब मैं आयात को बिना पैरामीटर प्रोग्राम के चलते घोषित करता हूं, लेकिन जब मैं चार पैरामीटर घोषित करता हूं –
डेल्फी का कौन सा संस्करण? –
हाय, मैं सीधे पहले नहीं सोच रहा था। मैं सरणी marshalling के बारे में भूल गया था। मेरा मानना है कि अद्यतन उत्तर आपके लिए नौकरी करेगा। –