Seite 1 von 2
Fehlerhafte String-Übergabe PB-DLL -> VB6-Programm
Verfasst: 21.09.2008 13:36
von Chef Wiggum
Guten Morgen
Ich habe ein kleines Problem bei der Rückgabe eines Strings aus einer in PureBaisc geschriebenen DLL an ein in Visual Basic 6 geschriebenes Programm. Das Thema wurde hier auch schon behandelt, jedoch hab ich immernoch ein kleines Problem :
In meinem Visual Basic Programm kommt immer nur das erste Zeichen von dem String an, der übergeben werden soll. Bei "Polizie" kommt z.B nur "P" an
Deklaration im Visual Basic 6 Programm :
Code: Alles auswählen
Private Declare Function Testfunktion Lib "test.dll" (ByVal sName As String, ByVal sVorname As String) As String
Code der PureBasic DLL:
Code: Alles auswählen
;[...]
sTemp = "TestTestTest"
lTemp1 = StringtoBstr(sTemp)
ProcedureReturn lTemp1
sTemp(String) und lTemp1(Long) sind jeweils als Global deklariert .
In meinem Visual basic Programm kommt bzw. käme in diesem Fall aber nur ein "T" an
Hier noch der andre Therad zum Thema :
http://www.purebasic.fr/german/viewtopi ... sual+basic
Danke im Vorraus
MFG
Verfasst: 21.09.2008 14:19
von ts-soft
Mal mit ByRef versucht?
Verfasst: 21.09.2008 16:58
von Chef Wiggum
Danke - Aber hilft leider auch nicht.
Auch das einfachste Beispiel... Gibt in diesem Fall auch wieder nur "J" aus.
Code: Alles auswählen
Global lTemp.l
Procedure StringToBStr(string$)
Protected Unicode$ = Space(StringByteLength(string$, #PB_Unicode) + 1)
Protected bstr_string.l
PokeS(@Unicode$, String$, -1, #PB_Unicode)
bstr_string = SysAllocString_(@Unicode$)
ProcedureReturn bstr_string
EndProcedure
ProcedureDLL.l TestString()
sTemp.s = "Julia"
lTemp = StringtoBStr(sTemp)
ProcedureReturn lTemp
EndProcedure
Code: Alles auswählen
Private Declare Function TestString Lib "test.dll" () As String
Private Sub Command1_Click()
MsgBox TestString
End Sub
Ich werd mal noch ein wenig suchen und probieren.
MFG
Verfasst: 21.09.2008 17:00
von Kiffi
@Chef Wiggum: probier das hier mal aus:
http://www.purebasic.fr/german/viewtopi ... 764#177764
Grüße ... Kiffi
Verfasst: 23.09.2008 15:53
von Chef Wiggum
Langsam wird mir die Sache schon peinlich...
Danke - Aber selbst wenn ich den Code 1:1 übernehme, verhält sich die Visual basic 6 Anwendung wie auch schon bisher bei der Übergabe eines Strings - Sie stürzt ab.
Vllt. mache ich die ganze Zeit einen grundlegenden Fehler - Wüsste aber nicht was.
MFG
Verfasst: 23.09.2008 15:56
von ts-soft
Chef Wiggum hat geschrieben:
Vllt. mache ich die ganze Zeit einen grundlegenden Fehler - Wüsste aber nicht was.
MFG
Vielleicht sollteste die DLL nicht als Unicode compilieren?
Verfasst: 26.09.2008 13:40
von Chef Wiggum
Danke nochmal für die Antworten - Aber es scheint alles nicht zu helfen.
Wären es nur ein paar Buchstaben die verarbeitet werden müssten, wäre die Sache vllt. nicht so ein Probelm. Dann würde sich vllt. eine Lösung mit ASCII Codes, die man ja als Long übertragen kann, oder so finden lassen.
Leider werden aber größere Zeichenketten verarbeitet.
*seufz*
MFG
Verfasst: 26.09.2008 18:45
von dysti
Kannste mal hiermit probieren:
Code: Alles auswählen
; DLL-Erstellung für Visual-Basic 6
; der erste Parameter muß immer Long sein als Zeiger
; zur Rückgabe
; alle anderen ist egal und können innerhalb
; der Procedure verwendet werden.
; Dies bezieht sich nur auf Stringrückgabe an das aufrufende Programm
ProcedureDLL.l TestFunk2( Inhalt.l ,Inhalt2.s)
;Protected string1.s
;Protected string2.s
string1.s = "Hallo Purebasic"
string2.s = Inhalt2
string1 = string1 + string2
CopyMemory(@string1, Inhalt, Len(string1))
;CopyMemory(@string2, Inhalt2, Len(string2))
ProcedureReturn 22
EndProcedure
ProcedureDLL.s TestFunk( Inhalt.l ,Inhalt2.s)
;Protected string1.s
;Protected string2.s
string1.s = "Hallo Purebasic"
string2.s = Inhalt2
string1 = string1 + string2
;*inhalt2=string2
;CopyMemory(@string1, Inhalt, Len(string1))
;CopyMemory(@string2, Inhalt2, Len(string2))
ProcedureReturn string1
EndProcedure
VB:
Code: Alles auswählen
Declare Function TestFunk2 Lib "F:\VBDLL\Etest.dll" (ByVal stext1 As String, ByVal stext2 As String) As Long
Declare Function TestFunk Lib "F:\VBDLL\Etest.dll" (ByVal stext1 As String, ByVal stext2 As String) As String
Verfasst: 27.09.2008 13:24
von mk-soft
Der zurückgegebene String an VB muss "Static" sein damit PB den speicherbereich NICHT frei gibt.
Ein VB-String hat ein Value "Long" vor den "String" wo die länge abgelegt ist.
Aber es muss der Pointer (Adresse) des String zurückgegeben werden.
Mein Beispiel Concat(...) funktionniert einwandfrei.
Wenn die DLL in Unicode compiliert ist mus bei der declaration in VB dieses angegeben werden.
FF

Re: Fehlerhafte String-Übergabe PB-DLL -> VB6-Programm
Verfasst: 12.10.2009 15:11
von ls9090
Nein, concat funktioniert bei mir leider auch nicht.