2010-03-04 17 views
5

Ich habe eine einfache Anwendung, die eine nicht verwaltete DLL lädt und einige Zeichenfolge Werte aus C# übergeben. Aber in der C++ - DLL-Anwendung erhalte ich eine Ausnahme: Versucht, auf einen schreibgeschützten Speicher zuzugreifen. Meine DLL Import sieht wie folgt aus:Übergabe C# Zeichenfolge an nicht verwaltete C++ 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); 

und die C++ Deklaration ist wie

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

Hilfe bitte !!!

+0

Scheint, dass Code in C++ nicht auf den Heap in C# zugreifen kann. – Kangkan

Antwort

7
string != LPStr 

Versuch:

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

} 
+0

Das ist richtig. Ändern Sie die Deklaration der Funktion auf der C++ - Seite, um ein roher Zeichen * anstelle eines std :: string zu akzeptieren. –

+0

Ich habe die Deklaration in char * geändert und es hat funktioniert. Aber sollte ich das Char * von C++ freigeben, sobald ich fertig bin. Wenn ich das nicht würde, würde das Speicherleck zur Folge haben. – Prabhu

+0

Vielen Dank Jungs. Ich habe sehr lange mit diesem Problem gekämpft. :( – DynamicScope

2

ich die pinvoke Signatur ändern würde ....

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

Und von der verwalteten Seite initialisiert, um die Stringbuilder-Klasse verwenden ....

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

Dann geben Sie die sbProcName und sbMessage zum DumpToDBLogFile ...

hoffe, das hilft, Mit freundlichen Grüßen, Tom.

Verwandte Themen