So geben Sie Text aus Nativem (C ++) Code zurück
Ich bin mit Pinvoke für die Interoperabilität zwischen Native(C++ -) code und Managed(C#) code. Was ich erreichen will ist get some text von native code in mein managed code. Für diese versuche ich viele viele Dinge,e.g Weitergabe string/stringbuilder von ref mit [IN] und [OUT -], Marshalling auf LPSTR, Rückgabe-string-aus-Funktion etc. aber nichts funktioniert in meinem Fall. Alle helfen mit einigen kleinen code würde sehr geschätzt werden.
InformationsquelleAutor der Frage Jame | 2011-03-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde es tun, mit einem
BSTR
da es bedeutet, dass Sie nicht haben, um Anruf in nativen zweimal pro string, einmal, um die Länge und dann einmal um den Inhalt.Mit einem
BSTR
den marshaller kümmern freigeben derBSTR
mit dem richtigen Speicher-manager, so dass Sie können sicher passieren, es aus deinem C++ - code.C++
C#
Es ist ein kleiner Nachteil der
BSTR
nämlich, dass es trägt einen UTF-16-Nutzlast-sondern die Quelldaten kann gut seinchar*
.Um dies zu überwinden, können Sie wickeln die Umwandlung von
char*
zuBSTR
wie diese:Das ist die Schlimmste aus dem Weg, und jetzt ist es einfach zu addieren, andere Wrapper zum konvertieren
BSTR
ausLPWSTR
std::string
std::wstring
etc.InformationsquelleAutor der Antwort David Heffernan
Hier ist ein Beispiel, dies zu tun durch C#. Ich rufe Native Funktion
GetWindowText
durch C# von pInvoking.GetWindowText
gibt die Beschriftung des Fensters, dessenhandle
an es übergeben wird.InformationsquelleAutor der Antwort Aamir
Hier ist ein Thema waren-string-Marshalling diskutiert wurde.
Es brauchen, markieren Sie den parameter mit dem Attribut
InformationsquelleAutor der Antwort Disposer
Wenn Sie die Rücksendung eines
char *
und wollen nicht zu ändern, das C/C++ - code zuordnen von Speicher für Ihren Rückgabewert (oder die Sie nicht ändern können, dass code), dann können Sie Ihre C# - extern-Funktion-Prototyp, um eineIntPtr
und tun das Marshalling selbst.Zum Beispiel, hier ist ein snippet von der interop-ich schrieb für Pocketsphinx:
Und hier ist der get-accessor für die C#
JsgfGrammar
Klasse.m_pU
ist einIntPtr
dass Punkte auf die raw -jsgf_t
Objekt.Ändern dieses Beispiel für die anderen string-Formate (z.B. Unicode), sollte trivial sein.
InformationsquelleAutor der Antwort ulatekh