Seite 1 von 2
DLL Nachbauen
Verfasst: 20.09.2004 16:46
von mcGeorge
Hallo Experten,
ich möchte eine DLL nachbauen. Da ich eigentlich VB6-Fan bin und eine "echte" DLL benötige, bin ich auf PureBasic gekommen. Leider ist das Problem bzw. mein Vorhaben doch nicht so einfach wie ich dachte.
Also, folgende Voraussetzungen:
Ich habe eine DLL mit folgender Funktion:
int GetStrings(LPSTR HADName, LPSTR HADNumber, LPSTR VKNR );
die ich in PureBasic nachbilden will. Die DLL mit dieser Funktion zu erstellen hat auch grundsätzlich geklappt, aber...
Bevor ich die Funktion aufrufe, initialisiere ich in VB6 die Variablen mit Leerzeichen.
Nachdem ich die Funktion aufgerufen habe, sollten in den 3 übegebenen String-Variablen sinnvolle Werte stehen, welche von der PureBasic-Funktion erstellt wurden.
Ich kann in PureBasic machen was ich will, die Übergebenen leeren Strings werden nie geändert.
Ich wiss jetzt werden ein paar schreiben ich soll Strukturen nehmen. Ich kann nichts ändern, da ich das Programm, welches diese DLL aufruft nicht ändern kann (*NoQuellText*).
Wenn PureBasic das nicht kann, weiss jemand wie das mit ASM geht?
Wirklich wichtig!
mfg
mcGeorge
Verfasst: 20.09.2004 17:27
von Franky
Hm, du hast den Quelltext vom Programm nicht, is ja auch egal, aber, den von der DLL wirst du doch wohl haben, denn, ehrlich gesagt, ich kann mir nich so recht was dadrunter vorstellen, was du da erklären wolltest
Verfasst: 20.09.2004 18:02
von mcGeorge
Ok, jetzt etwas eindeutiger:
Ich betreue ein Programm das Daten von Krankenkassenkarten einlesen kann. Das Programm unterstützt aber nur die originalen Tastaturen von Cherry. Ich möchte einen anderen Kartenleser unterstützen.
Wie ich inzwischen herausbekommen habe, nutzt das Programm die "G8015012.DLL" von Cherry, um die Karte auszulesen. Aus dieser DLL werden nur 2 Funktionen benötigt: G1501_init und G1501_ReadCardString. Die Funktionen und die Beschreibung der Funktionen ist im Internet auf den Cherry-Seiten erhältlich.
Mein Gedanke ist, eine "G8015012.DLL" in PureBasic zu schreiben und die originale durch diese zu ersetzen.
Die DLL mit den Funktionen zu erstellen hat auch funktioniert, aber die Rückgabe der Kartendaten an das aufrufende Programm klappt nicht.
Nach dem "G1501_init" mit Rückgabe 0 sollte die Funktion "G1501_ReadCardString" in den übergebenen 17 Strings den Inhalt der Karte liefern.
Syntax
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);
Rückgabewert
Fehlernummer
Beschreibung
Diese Funktion liest die Daten aus der Krankenversichertenkarte und speichert sie in den übergebenen 17 Puffern als Zeichenketten.
Wenn also in der DLL "G8015012.DLL" (geschrieben in PureBasic) die Funktion "G1501_ReadCardString" aufgerufen wird, wie ist es realisierbar, den Inhalt der übergebenen String-Puffer zu ändern, sodass das aufrufende Programm es mitbekommt?
Verfasst: 20.09.2004 19:09
von Rings
ja das iss machbar. Man schreib einfach einen wrapper dafür.
Verfasst: 20.09.2004 21:10
von topsoft
Hallo
ich habe da so im Hinterkopf das Strings in vb einen anderen aufbau haben als die nullterminierten in pb? Vieleicht kann sich da einer Äussern der es weiß. In der Hoffnung keinen Blödsinn erzählt zu habe euer Topsoft
Verfasst: 21.09.2004 07:13
von mueckerich
Hi McGeorge,
Hatte auch mal ein Problem mit einer DLL

in einem Prog
http://www.robsite.de/php/pureboard/viewtopic.php?t=128 das ich von VB nach PB portierte. Kann es sein das das Prog die Daten als String mit fester länge erwartet? Wenn ja dann probier doch mal den kniff von GPI
Code: Alles auswählen
; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=2064&highlight=
; Author: GPI
; Date: 22. August 2003
Structure OwnString
String.b[100] ; String mit der Länge 99 + 0-Byte / String with length 99 + 0-byte
EndStructure
a.OwnString
PokeS(@a\String[0],"Hallo") ; maximal 99 Zeichen! / max. 99 chars!
Debug PeekS(@a\String[0])
Gruß
mueckerich
Verfasst: 21.09.2004 14:14
von mcGeorge
Auch wenn ich lästig bin, ich verstehe die Lösungsansätze nicht. Bitte nochmal lesen und helfen!
Das ist die originale Deklaration in VB6:
Declare Function G1501_ReadCardString Lib "G8015012.DLL" ( _
ByVal KKName As String, ByVal KKNumber As String, _
ByVal VKNR As String, ByVal VNumber As String, _
ByVal VStatus As String, ByVal StatusSupplement As String, _
ByVal Title As String, ByVal Forename As String, _
ByVal NameSupplement As String, ByVal Surname As String, _
ByVal DateOfBirth As String, ByVal Street As String, _
ByVal CountryCode As String, ByVal PostalCode As String, _
ByVal City As String, ByVal ExpiryDate As String, _
ByVal Checksum As String) As Integer
Nachdem die Funktion aufgerufen wurde, enthalten die übergebenen Strings sinnvolle Werte von der Karte.
Da ich die originale DLL ersetzen möchte, muß der "Nachbau" sich genauso verhalten wie die Originale.
Daher die folgende Frage: Wie muß ich eine Procedure in PureBasic erstellen, das das folgende funktioniert?
1. Deklaration in VB6:
Declare Function ReadString Lib "PureBasic.dll" ( ByVal Inhalt1 As String, ByVal Inhalt2 As String) As Integer
2. Aufruf in VB6:
Dim sText1 As String
Dim sText2 As String
Dim iRet as Integer
sText1 = ""
sText2 = ""
iRet = 0
iRet = ReadString( sText1, sText2 )
3. Inhalt der Variablen nach dem Aufruf der Funktion "ReadString" in VB6:
iRet = 99
sText1 = "Das kommt aus PureBasic 1"
sText2 = "Das kommt aus PureBasic 1"
Wie ich den Rückgabewert "99" realisiert bekomme ist klar. Aber wie ich auf die Strings "schreibend" von PureBasic aus zugreifen kann, verstehe ich nicht. Offensichtlich werden von den originalen Strings Kopien erstellt, sodass Änderungen an diesen keine Auswirkungen auf die Strings in VB haben.
Verfasst: 21.09.2004 15:04
von topsoft
Hallo,
die Strings müssen schon in VB großgenug angelegt werden. Wie auch bei Api´s in Windows üblich. Dann mußt du VB nur noch dazu bringen die Strings als Speicheradresse auf das erste Element zu übergeben. Nun kann man in der DLL per PokeS in die Strings schreiben. Aber meiner Meinung nach sind Strings in VB und PB anders aufgebaut sodas du dir den String selber zusammen bauen musst. Mehr kann ich da jetzt erst mal nicht zu sagen da ich auf der Arbeit bin und auch kein VB habe.
Code: Alles auswählen
Dim sText1 As String
Dim sText2 As String
Dim iRet as Integer
sText1 = Space(255) ; eine DLL kann den Speicher eines
sText2 = Space(255) ; VB Strings nicht vergrössern
iRet = 0
iRet = ReadString( sText1, sText2 )
Gruß Topsoft
Verfasst: 21.09.2004 15:31
von helpy
Hilft
diese Info aus dem PureBoard-Archiv?
cu, helpy
Verfasst: 21.09.2004 17:52
von mcGeorge
Erstmal Danke für alle bisher geleisteten Hilfen,
"helpy" der Link ist hilfreich gewesen, aber du hast mich falsch verstanden. Es geht hier nur sekundär um VB6. Ich hätte auch Delphi, VisualObject oder eine andere Sprache wählen können.
Es geht um eine bereits tausendfach eingesetzte DLL von Cherry, die ich durch eine in PureBasic erstellte DLL ersetzen möchte. Die PureBasic-Dll soll sich exakt so verhalten die die originale (zumindest an den Schnittstellen).
Auf das Programm, das die DLL aufruft, habe ich keinen Einfluß. Das wird fertig vom Hersteller geliefert. Ist übrigens in PowerBuilder geschrieben worden. Der Hersteller hat mir freundlicherweise die Informationen gegeben, wie er die Karte ausliest. (DLL-Aufruf)
Er ist überzeugt davon, das kein anderer Kartenleser funktioniert.
Ich will denen beweisen, das es geht!!!!
Ich glaube der andere Ansatz mit "PokeS" ist das was ich suche. Werde das heute abend testen.