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

Anfängerfragen zum Programmieren mit PureBasic.
Chef Wiggum
Beiträge: 10
Registriert: 23.08.2008 10:11

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

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Mal mit ByRef versucht?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Chef Wiggum
Beiträge: 10
Registriert: 23.08.2008 10:11

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@Chef Wiggum: probier das hier mal aus:

http://www.purebasic.fr/german/viewtopi ... 764#177764

Grüße ... Kiffi
a²+b²=mc²
Chef Wiggum
Beiträge: 10
Registriert: 23.08.2008 10:11

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Chef Wiggum
Beiträge: 10
Registriert: 23.08.2008 10:11

Beitrag 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
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag 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
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
ls9090
Beiträge: 4
Registriert: 12.10.2009 15:09

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

Beitrag von ls9090 »

Nein, concat funktioniert bei mir leider auch nicht.
Antworten