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... :oops:

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 :wink:

Re: Fehlerhafte String-Übergabe PB-DLL -> VB6-Programm

Verfasst: 12.10.2009 15:11
von ls9090
Nein, concat funktioniert bei mir leider auch nicht.