Hallo,
eine Treiber-DLL bringt mich ein wenig zum verzweifeln. Vielleicht bin ich ja auch ein wenig doof und übersehe eine zu offensichtliche Kleinigkeit.
Wenn jemanden zu der Geschichte etwas Schlaues einfällt wäre das jedenfalls extrem toll.
Zum Ansteuern einer Kassenlade muss ich Funktionen aus einer DLL laden. Als Beispiel verwende ich hier einmal 'OpenPosInterface'. Die DLL an sich funktioniert. Das habe ich mit einem Demoprogramm, welches der Lade beilag, ausprobiert.
Mit TDUMP habe ich nachgeschaut und die Funktion ist vorhanden. Einmal mit, einmal ohne Parameter. Um die Sache nicht zu komplizieren geht es jetzt erstmal um die parameterlose Version.
Den Funktionszeiger habe ich wie folgt definiert :
Delphi-Quelltext
1:
| TOpenPosInterface = function () : Cardinal; stdcall; |
Der Test fürs Laden sieht so aus :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm_MQTest.AdvGlowButton_1Click(Sender: TObject); var funcOpenPosInterface : TOpenPosInterface;
cardDLLHandle : Cardinal; begin ListBox_1.Clear;
cardDLLHandle := LoadLibrary('pos.dll'); if cardDLLHandle > 0 then begin ListBox_1.Items.Add('DLL geladen : ' + IntToStr(cardDLLHandle));
try funcOpenPosInterface := GetProcAddress(cardDLLHandle, 'OpenPosInterface'); if Assigned(funcOpenPosInterface) then ListBox_1.Items.Add('FUNKTIONSZEIGER GEFUNDEN.') else ListBox_1.Items.Add('Keinen Funktionszeiger geladen.'); finally FreeLibrary(cardDLLHandle); ListBox_1.Items.Add('DLL entladen.'); end; end; end; |
Das Laden der DLL funktioniert. Danach ist aber schluss.
Ausser 'stdcall' habe ich auch noch 'cdecl', 'safecall' und 'register' (das ich für 'fastcall' noch einiges umbauen müsste ist mir bewusst, aber zumindest die Einsprungadresse sollte ich erhalten) ausprobiert und nichts davon hat die DLL dazu bewogen, irgendetwas heraus zu rücken.
Falls jemand rumprobieren möchte, die DLL samt Doku gibt es auf
www.mogler.de/download/index.html
unter dem Link 'Programmbibliothek für Windows' (egal in welcher Version, verweißt beides auf dieselbe DLL).
In der zugehörigen Doku (die ich auf der Seite gerade nicht wieder finde) steht zu der fraglichen Funktion nur :
/***********************************************************************
* Oeffnet das Interface, Initialisiert die Ports und liest die Anzahl
* der Kassenoeffungen aus dem Kasseninterface in die Variable LastOpenCnt
* ein
* Uebergibt den DeviceHandle ans aufrufende Programm
* Bei einem Fehler wird INVALID_HANDLE_VALUE zurueckgegeben
************************************************************************/
HANDLE OpenPosInterface()
Tja, das war es schon. An dieser Stelle möchte ich noch erwähnen, dass der Support bei Mogler sich primär durch nicht vorhandene Motivation auszeichnet ...
Ich hoffe, dass ich nur irgendwo einen simplen Denkfehler drin habe und jemand hier ganz spontan sagt 'Guck mal was da steht ...'.
Schonmal danke für für eure Mühe,
Ralf Biniasch
Moderiert von
Narses: Code- durch Delphi-Tags ersetztModeriert von
Narses: Topic aus Sonstiges (Delphi) verschoben am So 22.06.2008 um 02:11