Seite 2 von 2

Verfasst: 21.09.2004 20:10
von helpy
mcGeorge hat geschrieben:int G1501_ReadCardString(LPSTR HADName, LPSTR HADNumber, LPSTR VKNR, LPSTR AssurancyNumber, LPSTR AssurancyStatus, LPSTR StatusSuppl, LPSTR Title, LPSTR Forname, LPSTR NameSuppl, LPSTR Surname, LPSTR DateOfBith, LPSTR Street, LPSTR CountryCode, LPSTR PostalCode, LPSTR City, LPSTR ExpiryDate, LPSTR Checksum);
Hattest Du es schon so versucht:

Code: Alles auswählen

ProcedureDLL G1501_ReadCardString(HADName, HADNumber, ..., CheckSum)
  PokeS( HADName, "Name" )
  PokeS( HADNumber, "Nummer" )
  ;...
  PokeS( CheckSum, "03AF45C8" )
  ProcedureReturn 99 ; oder etwas anderes
EndProcedure
Da an die Funktion Pointer auf Strings (= LONG-Wert) übergeben werden, reicht es, wenn auch LONG-Variablen verwendet werden. Mit PokeS(PointerAufString, "String") kannst Du dann den String beschreiben.

WICHTIG: An der angegebenen Adresse muss genügend Speicher zur Verfügung stehen. D.h. vor dem Aufruf der DLL-Funktion müssen Strings (bzw. Puffer) mit der entsprechenden Größe erzeugt werden (aber das sollte ja in dem bereits vorhanden Programm ja schon richtig gemacht werden). In VB6 (wie Du oben beschrieben hast) wird zwar der String ByVal übergeben, was aber in Ordnung ist (siehe mein Posting oben).

cu, helpy

Verfasst: 22.09.2004 08:01
von mcGeorge
Erstmal :( an "helpy" ich hätte besser lesen sollen, anstatt zu schreiben, das du mich nicht verstanden hast.

:mrgreen: Ich habe die Lösung gefunden, dank deines Hinweises!

Das folgende Beispiel funktioniert:

:: PureBasic.Dll ::
ProcedureDLL.l TestFunk( Inhalt.l )
Protected ReturnString.s
ReturnString = "Hier ist PureBasic"
CopyMemory(@ReturnString, Inhalt, Len(ReturnString))
ProcedureReturn 22
EndProcedure

:: VB6 ::
Declare Function TestFunk Lib "purebasic.dll" (ByVal sText As String) As Long

Sub Main()
Dim sInhalt As String
Dim lReturn As Long
sInhalt = Space(30)
lReturn = 0
lReturn = TestFunk(sInhalt)
MsgBox sInhalt
End Sub

Der in VB6 mit Leerzeichen initialisierte String "sInhalt" wird von der PureBasic-Dll mit dem Worten "Hier ist PureBasic" gefüllt und steht in VB6 wieder zur verfügung.

Wichtig ist natürlich, das der reservierte String-Speicher in VB6 groß genug ist.


So der Test hat geklappt, nun werde ich testen, ob das auch mit der richtigen Applikation klappt.

mfg
gg

Verfasst: 22.09.2004 13:18
von mcGeorge
Alles Sahne, super u.s.w.

Es klappt!!! :allright: :bounce: :bounce:

Verfasst: 23.09.2004 10:01
von brotkasten-deluxe
Tool dieses Thema :allright: Er riecht gewaltig nachner neuen Lib ..... :wink:

Verfasst: 23.09.2004 20:15
von KingKong
bei mir hat es folgendermaßen funktioniert:

im aufrufenden Programm genügend große Leerstrings erzeugen !
im Aufruf die Adressen des Speicherorts für die Variableninhalte übergeben !

das PureBasic-Dll mit nachfolgendem Code:

ProcedureDLL.l ReadString( *sText1, *sText2 )
PokeS(*sText1,"es klappt !!")
PokeS(*sText2,"klappt auch!!")
ProcedureReturn 99
EndProcedure