2009-05-06 15 views
2

Ich habe eine C++ DLL, die ein int* an ein C# -Programm zurückgibt. Das Problem ist die int* in C# bleibt null nach der Zuweisung.Convert IntPtr zu int * in C#?

Wenn ich das C++ Ergebnis einer IntPtr zuweisen, erhalte ich einen richtigen Wert ungleich Null. Jeder Versuch, dies zu einem int* zu konvertieren, führt jedoch zu null.

Ich habe versucht:

IntPtr intp = cppFunction();   // Non-null. 

int* pi = (int *) intp;     // Results in null. 

int* pi = (int *) intp.ToPointer(); // Results in null. 


void* vp = intp.ToPointer(); 

int* pi = (int *) vp;     // Results in null, but vp is non-null. 

Wie kann ich einen Nicht-Null-int* bekommen?

Danke!

void cppFunction(ref int* ptr) { 
    ptr = somevalue; 
} 

, dass Ihr Problem lösen sollte: Alan

+0

verwendete ich den Standard malloc() Funktion von msvcrt.dll als "cppFunction()". Es funktionierte für mich in Ordnung, ich konnte sogar den zugewiesenen Speicherplatz lesen/schreiben. Wenn ich Intp (IntPtr intp = (IntPtr) 1000;) eine Zufallszahl zugewiesen habe, bekam ich eine NullPointerException nur beim Dereferenzieren. Dennoch war der Wert des Zeigers nie null ... Können Sie mir ein kleines, komplettes Programm geben, das die falschen Ergebnisse produziert? – Hali

+0

haben Sie die Möglichkeit, das C++ zu refaktorieren, so dass Sie IntPtr mit dem erforderlichen Speicher übergeben können? es wäre besser so - oder schließen Sie einen Rückruf, um den Speicher in C# gemäß http://stackoverflow.com/questions/9378626/how-can-i-return-a-stringbuilder-or-other-string- buffer-from-a-pinvoke-native-ca – dice

Antwort

4

Sie cppFunction Erklärung sollte etwas ähnliches sein.

Sie können dies auch nützlich finden: http://www.pcreview.co.uk/forums/thread-2902012.php

+0

Danke James. Ich habe versucht, Ihre Methode wie folgt: [DllImport ("vdrdll.dll" Entrypoint = @ "getLineContentsAsArg @@ YAXAAPAH @ Z?")] öffentlich unsicher statisch extern void getLineContentsAsArg (ref int * Ica); DLLEXPORT ungültig getLineContentsAsArg (int * & lca) { \t lca = berechnenLineContents(); } Ein Zeigerwert wird in der DLL zugewiesen, aber wenn es zurück zu C# kommt, ist es null. Ich schaute auf Ihre Beispiele, und nur der letzte versucht, eine Zeigervariable in C# zuzuweisen. Jedes Mal, wenn ich das versucht habe, ist das Ergebnis der Zuweisung null. Kannst du etwas sehen, was ich falsch mache? Danke! – user20493

+0

Ich werde es genauer betrachten müssen, wenn ich mit dem Mähen fertig bin, aber ich erkannte, dass ich in C# vor kurzem einen Puffer zugewiesen habe, den Zeiger auf den nicht verwalteten Code geschickt habe, zusammen mit einem IntPtr, um die Länge zu erhalten . Das Problem, auf das Sie stoßen, liegt wahrscheinlich an der Tatsache, dass Sie erwarten, dass die C++ - Funktion das Malloc ausführt und die Zeichenfolge zurückgibt. In diesem Fall müssen Sie wahrscheinlich einen Zeiger auf den Zeiger übergeben, aber ich bin nicht sicher, wie Sie das in C# freigeben würden, wenn Sie damit fertig sind. –