VB-Zeichenkette in/aus DLL
-
Hallo,
bei mir stellt sich folgendes Problem:
ich habe eine C-Dll erzeugt, die Funktionen exportiert. Bei der folgenden Fkt.
"extern "C" VOID PASCAL EXPORT DLL_Veraendere(char* x)"
möchte ich von Visual Basic aus einen String an die DLL übergeben die diesen verändert. VB sollte dann den 'veränderten' String weiter verarbeiten. Der String wird zwar von VB zur DLL richtig übergeben. Umgekehrt funzt das aber überhaupt nicht. Wie muss eine solche Übergabe richtig aussehen?
Danke
-
Hi
Ich hatte da auch so meine Probleme damit.
Nun habe ich es so gelöst, dass ich aus der dll eine Temporaer-Datei im verzeichniss C:\Temp erstellen lasse und dort, die von der DLL erzeugten Strings zwischenspeichere. Dann lasse ich sie von meinem VB6 Programm auslesen.
Umgekehrt verfahre ich genau so. Funktioniert übrigens Fehlerfrei und sehr zufriedenstellend.
Viel Spass beim ausprobieren!!
-
Erstmal vorweg: Ich bin kein Basic-Crack

In VB werden Strings intern als Unicode-Strings (16 Bit pro Zeichen) behandelt. Ich würde die Funktion in der DLL also auf wchar_t* anstatt char* umstellen...
EDIT: Alternativ kannst du aus Basic auch mit StrConv den String in ein Byte-Array umwandeln. Dann sollte es auch mit char* klappen. Die Lösung mit der Temporärdatei funktioniert zwar auch ist aber:
1.) unsauber
2.) unsicher
3.) langsam
4.) schlicht und einfach schlecht[ Dieser Beitrag wurde am 08.06.2003 um 14:16 Uhr von MaSTaH editiert. ]
-
Hallo,
Danke für Eure Antworten. Ich habe eine Lösung gefunden, die wie folgt aussieht:Die Funktion in der C-DLL sieht so aus:
extern "C" INT PASCAL EXPORT SCP_ReceiveData(char * x, unsigned int len) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); char *test; test = "dies ist es jetzt!"; // reicht der Speicherplatz aus? if ((strlen(test) + 1) > len) { return -1; } memcpy(x,test,strlen(test) + 1); //das ist es! return 0; }Die Deklaration der Dll-Funktion in VB:
Private Declare Function SCP_ReceiveData _ Lib "Test.dll" ( _ ByVal Puffer As String, _ ByVal Length As Integer ) As IntegerAchtung: der String muss in diesem Fall ByVal übergeben werden. ByVal verliert hier aber seine ursrüngliche Bedeutung. Es wird hiermit ein Zeiger auf die nullterminierte Zeichenkette übergeben. (ByRef würde einen Zeiger auf eine BSTR-Struktur liefern...)
Der Aufruf der Funktion in VB:
Dim strPuffer As String Dim intRueck As Integer strPuffer = String$(260, 0) 'Speicher reservieren soviel wie nötig intRueck = SCP_ReceiveData(strPuffer, Len(strPuffer)) 'hier kann der Rückgabewert ausgewertet werden strPuffer = C2VBString(strPuffer) 'Funktion sucht das erste Chr(0) im String und gibt ihn bis dort zurückUnd das funzt - jedoch die Verwendung natürlich auf eigene Gefahr!
Gruß,
Gerto
-
Effizienter wäre es, den String schon in der DLL in ein VB-lesbares Format umzuwandeln, z.B. mit BSTR und SysAllocString!