Entwickler-Ecke

Dateizugriff - DLL verweigert Einsprungadressen


RBiniasch - Fr 20.06.08 16:18
Titel: DLL verweigert Einsprungadressen
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

http://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 - 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 [http://www.dependencywalker.com/] 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


baka0815 - 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 - 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 - 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?


RBiniasch - 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