Stl String zu BSTR konvertieren in Win32Dll
-
Hi,
ich habe eine andere Frage Dlls betreffend.
Ich habe eine Win32Dll erstellt die ich in einem Vb Projekt verwende.
Ein Funktion dieser Dll gibt mir einen Int nach VB zurück, das klappt, nun werden in meiner Funktion in der Dll noch zusätzlich string Operationen durchgeführt, als Rückgabewert habe ich ebenfalls einen Stl String.Da dies jedoch keine so gute Idee ist:
Grundsätzlich solltest Du niemals std:string's über DLL Grenzen hinweg weitergeben. Diese Objekte sind direkt von der Compilerversion und der verwendeten CRT abhängig. Sie eignen sich in keiner Weise zum Datenaustausch zwischen Modulen. Du solltest auf PODs oder BSTR zurückgreifen.wollte ich BSTR nutzen, aber die Dll wehrt sich tapfer !
Was muss ich denn includen und wie muss die Konvertierung aussehen
ich hab der Einfachheit halber eine kleine Bsp.Fnkt erstelltWIN32DLL02_API const char* fnWin32DLL02(void) { string test; test = "abc"; return test; } C/C++ Code: WIN32DLL02_API const char* fnWin32DLL02(void) { string test; test = "abc"; return test; }wenn ich const char* und test.c_str() nutze frißt das die dll zwar aber ich bekomm ne Zahl zurück !
vielen Dank für Eure Mühe
ShadowEater
-
Hmm überleg mal was mit Objekten passiert, wenn ihr Scope verlassen wird(in dem Fall die Funktion) und was mit Zeigern auf diese passiert ...
-
oh ich hab 2 mal das gleiche gepostet

Mit BSTR wird jetzt ein Buchstabe zurückgegeben !
Danke
ShadowEater
-
ShadowEater schrieb:
oh ich hab 2 mal das gleiche gepostet

Mit BSTR wird jetzt ein Buchstabe zurückgegeben !
Das wird an der fehlerhaften Deklaration der DLL-Funktion in VB liegen.
In jedem Fall ist Deine Funktion aber so einer Katastrophe geweiht, denn Du scheist einen Zeiger auf einen nicht mehr existierenden Speicherbereich zurückzugeben.Das Arbeiten mit BSTRs ist ein wenig komplizierter. Ich finde es einfacher, wenn VB die Arbeit übernimmt, den notwendigen Speicher anzufordern und C++ diesen nur befüllt, dadurch spart man sich eine Menge Ärger. Man muss freilich darauf achten, dass man in VB genügend Speicher reserviert. Dann übergibt man diesen Speicher einfach als
char*an die API-Funktion und kopiert dann den String dort hinein:WINAPI void BeispielMitString(char* str) { // Gefährliche Annahme: 'str' zeigt auf genügend Speicher. std::string ret = "Test"; std::copy(ret.begin(), ret.end(), str); }Und Deklaration / Aufruf in VB6:
Declare Sub BeispielMitString Lib "wasweißich.dll" (ByVal str As String) ' … Dim MeinString As String MeinString = Space$(4) Call BeispielMitString(MeinString)Falls Du mit VB.NET arbeitest, kann man sich die Arbeit Dank Marshalling verringern und einfach nen StringBuilder verwenden:
Declare Sub BeispielMitString Lib "wasweißich.dll" (ByVal str As StringBuilder) ' … Dim MeinString As New StringBuilder(4) BeispielMitString(MeinString)
-
Hi Konrad Rudolph,
danke für die schnelle Antwort, Space$(4) war der Fehler, jetzt liefer die DLL den gewünschten String an VB. Hab die Sache jetzt auf BSTR umgestellt.
Wie funktioniert die Übergabe eines Strings von Basic an die DLL mit BSTR kennst DU / IHR ein gutes ATL Tutorial?

Ich bin dabei die DLL für nen VB Programmierer zu schreiben nicht für mich und da ich mich in VB nicht soooo gut auskenne... isses ab und zu n' bissl pfriemelig

Danke nochmal und schönes Wochenende
ShadowEater
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.