2011-12-28 14 views
7

से डेल्फी डीएलएल फ़ंक्शन को कॉल करना मेरे पास डेल्फी 2007 में संकलित एक डीएलएल है और अन्य डेल्फी प्रोजेक्ट में इसका उपयोग करने वाला एक उदाहरण है।सी # कोड

TErrorCallback = function(Msg:PChar):byte of object; 
TSaveEventCallback = function (Line:PChar; HiCode:PChar; LoCode:PChar; MobileNo:PChar):byte of object; 

function InitModule(ErrorCallback:TErrorCallback; SaveEventCallback :TSaveEventCallback; MainWindowHandle:THandle; Sock_Event:integer):byte; stdcall; external 'My.dll' name 'InitModule'; 

function DLLSocketEvent(var msg: TMessage): byte; stdcall; external 'My.dll' name 'DLLSocketEvent'; 

function InitObjList(Objs: array of PChar; NumObjs: byte; Name: PChar):byte; stdcall; external 'My.dll' name 'InitObjList'; 

यहाँ है मेरी सी # एनालॉग और:: यहाँ कोड का एक हिस्सा है

class Message 
{ 
    unsigned int msg; 
    int wParam; 
    int lParam; 
    int result; 
}; 
delegate byte ErrorCallbackDelegate(string msg); 
delegate byte SaveEventCallbackDelegate(string line, string hiCode, string loCode, string mobileNo); 

[DllImport("My.dll")] 
static extern byte InitModule(ErrorCallbackDelegate errorCallback, SaveEventCallbackDelegate saveEventCallback, IntPtr mainWindowsHandle, Int32 sockEvent); 

[DllImport("My.dll")] 
static extern byte DllSocketEvent(Message msg); 

[DllImport("My.dll")] 
static extern byte InitObjList(string[] objs, byte numObjs, string name); 

बिंदु मैं केवल InitModule विधि की कोशिश की है और यह एक अपवाद throwed है: PInvoke कार्य करने के लिए एक कॉल 'ProjTest! ProjTest.MyClass :: InitModule' ने स्टैक को असंतुलित किया है। ऐसा संभव है क्योंकि प्रबंधित PInvoke हस्ताक्षर अप्रबंधित लक्ष्य हस्ताक्षर से मेल नहीं खाता है। जांचें कि कॉलिंग सम्मेलन और PInvoke हस्ताक्षर के पैरामीटर लक्ष्य अप्रबंधित हस्ताक्षर से मेल खाते हैं।

कृपया, इसके साथ मेरी सहायता करें। सी # में इन डीएलएल कार्यों का वर्णन कैसे करना चाहिए?

उत्तर

11

आप उस डीएलएल को सी # से नहीं बुला सकते हैं। मुख्य समस्या दो of object कॉलबैक हैं। उस मैच के लिए सी # में कोई रास्ता नहीं है। आपको मौजूदा डीएलएल को संशोधित करने या इंटरमीडिएट एडाप्टर डीएलएल जोड़ने की आवश्यकता होगी। चूंकि यह खड़ा है कि आपका डीएलएल केवल डेल्फी या सी ++ बिल्डर से ही सुलभ है।

यदि आप डीएलएल को संशोधित कर सकते हैं तो आपको of object को हटाने के लिए संशोधित करने की आवश्यकता है। यदि आपको किसी उदाहरण पर कार्य करने के लिए कॉलबैक की आवश्यकता है तो आपको आवृत्ति को पैरामीटर के रूप में पास करने की आवश्यकता होगी। हालांकि, सी # प्रतिनिधि सभी पारदर्शी रूप से लपेट सकते हैं ताकि आपको डीएलएल को अन्य भाषाओं से सुलभ होने की आवश्यकता हो, तो आपको केवल पैरामीटर के रूप में आवृत्ति को पारित करने की आवश्यकता होगी, उदा। डेल्फी।

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

मुझे यह भी समझ में नहीं आता कि आप सरणी लंबाई रखने के लिए byte प्रकार का उपयोग क्यों कर रहे हैं। इसके लिए आपको Integer का उपयोग करना चाहिए। बाइट का उपयोग करने से लाभ प्राप्त करने के लिए कुछ भी नहीं है और आप बस अतिप्रवाह आमंत्रित करते हैं। इसके अलावा, MainWindowHandle डेल्फी में THandle नहीं होना चाहिए। यह HWND होना चाहिए।

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

+0

नीचे वोट क्यों? –