2010-03-04 14 views
5

पर सी # स्ट्रिंग पास करना मेरे पास एक साधारण एप्लिकेशन है जो एक अप्रबंधित डीएलएल लोड करता है और सी # से कुछ स्ट्रिंग मान पास करता है। लेकिन सी ++ डीएलएल एप्लिकेशन में, मुझे एक अपवाद प्राप्त होता है :: पढ़ने/लिखने की सुरक्षित मेमोरी तक पहुंचने का प्रयास किया जाता है। मेरे DLL आयात इस तरह दिखता है:अप्रबंधित सी ++ डीएलएल

[DllImport("X.dll", CallingConvention = CallingConvention.Cdecl) ] 
public static extern int 
DumpToDBLogFile([MarshalAs(UnmanagedType.I4)]int loggingLevel, 
       [MarshalAs(UnmanagedType.I4)]int jobId, 
       int threadId, 
       [MarshalAs(UnmanagedType.LPStr)]string procName, 
       [MarshalAs(UnmanagedType.LPStr)]string message); 

और सी ++ घोषणा

extern "C"  
__declspec(dllexport) int DumpToDBLogFile(int loggingLevel, int jobId, int threadId, string procName, string message) 
{ 
    //access strings.. 
} 

सहायता कृपया की तरह है !!!

+0

सी ++ में कोड लगता है सी # में ढेर तक पहुंचने में सक्षम नहीं है। – Kangkan

उत्तर

7
string != LPStr 

कोशिश:

extern "C" 
__declspec(dllexport) int DumpToDBLogFile(int loggingLevel, int jobId, int threadId, char* procName, char* message) { //access strings.. 

} 
+0

यह सही है। एक std :: स्ट्रिंग के बजाय कच्चे char * को स्वीकार करने के लिए C++ पक्ष पर फ़ंक्शन की घोषणा बदलें। –

+0

मैंने घोषणा को char * में बदल दिया और यह काम किया। लेकिन जब मैं कर रहा हूं तो मुझे सी ++ से चार * को हटा देना चाहिए। अगर मैं स्मृति रिसाव में परिणाम नहीं होगा .. ?? – Prabhu

+0

बहुत बहुत धन्यवाद दोस्तों। मैंने इस समस्या से बहुत लंबे समय तक संघर्ष किया है। :( – DynamicScope

2

मैं .... PInvoke हस्ताक्षर को संशोधित करेगा

 
[DllImport("X.dll", CallingConvention = CallingConvention.Cdecl) ] 
public static extern int 
DumpToDBLogFile(int loggingLevel, int jobId, int threadId, StringBuilder procName, StringBuilder message); 

और कामयाब ओर से StringBuilder वर्ग प्रारंभ का उपयोग ....

 
StringBuilder sbProcName = new StringBuilder(1024); 
StringBuilder sbMessage = new StringBuilder(1024); 

फिरमें पास करेंऔर DumpToDBLogFile करने के लिए sbMessage ...

आशा इस मदद करता है, सादर, टॉम।