मैं सी में लिखा एक डीएल से एक समारोह कॉल करने के लिए सी # इंटरऑप का उपयोग करना चाहता हूँ। मेरे पास हेडर फाइलें हैं I इस पर एक नज़र डालें:मैं इस सी फ़ंक्शन को C# (unmarshalling रिटर्न स्ट्रक्चर) में कैसे कॉल करूं?
enum CTMBeginTransactionError {
CTM_BEGIN_TRX_SUCCESS = 0,
CTM_BEGIN_TRX_ERROR_ALREADY_IN_PROGRESS,
CTM_BEGIN_TRX_ERROR_NOT_CONNECTED
};
#pragma pack(push)
#pragma pack(1)
struct CTMBeginTransactionResult {
char * szTransactionID;
enum CTMBeginTransactionError error;
};
struct CTMBeginTransactionResult ctm_begin_customer_transaction(const char * szTransactionID);
मैं कैसे ग # से ctm_begin_customer_transaction कहते हैं। कॉन्स char * mapps को स्ट्रिंग करने के लिए अच्छी तरह से है, लेकिन विभिन्न प्रयासों के बावजूद (स्टैक ओवरफ्लो और अन्य साइटों को देखते हुए), मैं वापसी संरचना को मार्शल करने में विफल रहता हूं। CTMBeginTransactionResult संरचना = (CTMBeginTransactionResult) Marshal.PtrToStructure (PTR, typeof (CTMBeginTransactionResult)): यदि मैं समारोह IntPtr यह ठीक काम करता है वापस जाने के लिए ...
परिभाषित संपादित मैं IntPtr और प्रयोग करने में वापसी प्रकार बदल ; लेकिन यह AccessViolationException
फेंकता मैं भी करने की कोशिश की:
IntPtr ptr = Transactions.ctm_begin_customer_transaction("");
int size = 50;
byte[] byteArray = new byte[size];
Marshal.Copy(ptr, byteArray, 0, size);
string stringData = Encoding.ASCII.GetString(byteArray);
stringData == "70e3589b-2de0-4d1e-978d-55e22225be95 \ 0 \" \ 0 \ 0 \ एक \ 0 \ 0 \ b \ बी? "इस बिंदु पर।" 70e3589b-2de0-4d1e-978d-55e22225be95 "संरचना से szTransactionID है। एनम कहां है? क्या यह अगला बाइट है?
आपके उत्तर के लिए धन्यवाद। टिप्पणी मेरे उत्तर देने के लिए एक बुरी जगह है, इसलिए इसके बजाय प्रश्न संपादित किया। संभावित स्मृति रिसाव मुद्दे को खोजने के लिए – Eiver
+1 – Eiver