von CString nach System.string
-
Hi, auch wenn auf meine fragen nie wer antwortet, ich versuchs nochmal
Ich hab eine .dll in C++ welche eine Methode Exportiert die einen CString zurückliefert.
Nun muss ich von C# irgendwie auf die Methode zugreifen. Nur scheitert es bisher an dem CString. Wie kann ich den übergeben ?
Versucht hab ich schon per Return, per Übergebenem Parameter, als
string = LPCTSTR(CString), als übergebener Pointer, mit und ohne "out"...Es kommt immer ein "Referenz of Object not set".
Mit allen anderen Datentypen wie Long, Int usw. geht es aber Problemlos.Anmerkung die DLL kann ich noch verändern, das C# Programm auch. Die dll muss aber in C++ bleiben...
Hat wer ne Idee ?
Die Methode der .dll
extern "C" dllexport HRESULT GetDir(string str) { /*.....*/ if (blah) { str = LPCTSTR(CString_Variable); return S_OK; } return E_FAIL; }
-
Es ist eine sehr schlechte Idee von C# aus ohne Wrapper (den du normalerweise in C++ schreiben musst) C++ Klassen verwenden zu wollen. Möglicherweise lässt sich per Marshaling etwas machen, aber das ist unschon. Aber dein Code alleine ist schon völlig sinnlos, weil "string str" als Parameter eine lokale Kopie des Strings übergibt. Wenn du dieser etwas zuweist, dann wirkt sich das nur auf die lokale Kopie aus, nicht auf die übergebene Variable. Probier es mit einem Zeiger oder einer Referenz.
-
Ja wie geschrieben hab ich es auch mit Zeiger schon probiert, ebenfalls auch einfach per Return.
Denke das proble ist das die Stringtypen nicht kompatibel sind oder ?
-
Elfblood schrieb:
Denke das proble ist das die Stringtypen nicht kompatibel sind oder ?
Du hast es erfasst.
-
C++
extern "C" dllexport HRESULT GetDir(TCHAR* pStr, int nCharsInBuffer) { if (blah) { _tcsncpy(pStr,CString_Variable,nCharsInBuffer); pStr[nCharsInBuffer-1] = 0; return S_OK; } return E_FAIL; }
C#
[ DllImport("bla.dll") ] static extern HRESULT GetDir(StringBuilder text, int count); ... StringBuilder str = new StringBuilder(nMaxChars); GetDir(str,nMaxChars); ... x = str.ToString();