Autor Beitrag
RBiniasch
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 20.06.08 16:18 
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 :

ausblenden Delphi-Quelltext
1:
  TOpenPosInterface = function () : Cardinal; stdcall;					


Der Test fürs Laden sieht so aus :

ausblenden 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 user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am So 22.06.2008 um 02:11
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Fr 20.06.08 16:56 
Wenn ich das richtig verstanden habe gibt GetProcAddress nil zurück, die Funktion wird also nicht gefunden (BTW: GetProcAddress ist es völlig egal welche Aufrufkonvention verwendet wird, das ist nur für den Delphi-Compiler für den Aufruf der Funktion wichtig).
Ich hab mir die DLL mal mit dem Dependency Walker angeschaut und demnach gibt es nur Funktionen namens @OpenPosInterface$quc und @OpenPosInterface$qv, aber keine OpenPosInterface, es ist also kein Wunder, dass GetProcAddress nichts findet. Diese "Anhängsel" entstehen durch das name-mangling, gehören aber trotzdem zum Funktionsnamen dazu, du musst also auch nach diesen Namen suchen. Alternativ kannst du aber auch über Ordinal-Werte gehen...

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Fr 20.06.08 16:57 
Zitat:
/***********************************************************************
* 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
************************************************************************/

Vielleicht ist bei der Initialisierung was schief gelaufen?

Musst du vorher evtl. eine andere Funktion aus der DLL zur Initialisierung aufrufen?
Ist die Kasse denn korrekt angeschlossen? Kann die DLL auf den Port zugreifen?
RBiniasch Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 20.06.08 17:03 
Sorry, das kam vielleicht nicht so richtig rüber.

GetProcAddress liefert nur nil zurück.
Ich kann also gar nicht versuchen irgend etwas zu initialisieren ...
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Fr 20.06.08 17:08 
user profile iconRBiniasch hat folgendes geschrieben:
Sorry, das kam vielleicht nicht so richtig rüber.

GetProcAddress liefert nur nil zurück.
Ich kann also gar nicht versuchen irgend etwas zu initialisieren ...

Hast du mein Posting übersehen?

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
RBiniasch Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 20.06.08 17:09 
@Motzi :

Ahh, danke. Ich hatte nur mit dem TDUMP von Delphi nachgeschaut und da ist von solchen Anhängseln nichts zu sehen

Jetzt funktioniert es. Ich wusste doch, dass muss was doofes sein ... 8)

Nochmal danke,
Ralf Biniasch