'Fremde' DLL in VB6 nutzen

Hallo,

ich bin im Moment auf der Suche nach einer Möglichkeit, die Idle-Zeit des Benutzers zu ermitteln (wie lange die Maus nicht bewegt bzw. keine Taste gedrückt wurde). Das scheint kein triviales Problem zu sein, d.h. es gibt keinen einfachen API-Aufruf, mit dem man Windows befragen könnte.

Praktischerweise wurde das Problem schon von jemand anderem gelöst und in Form einer DLL umgesetzt:
http://www.codeproject.com/dll/trackuseridle.asp

Ich habe noch nie mit ‚fremden‘ DLLs gearbeitet und bin auf ein Problem gestoßen, bei dem ich nicht weiterkomme:

Declare Function IdleTrackerInit Lib „c:\PFAD\idletrac.dll“ Alias „IdleTrackerInit“ () As Boolean
ret = IdleTrackerInit()

Dieses Code-Schnippsel gibt mir die Fehlermeldung „DLL-Einsprungpunkt IdleTrackerInit in c:\PFAD\idletrac.dll nicht gefunden“

Aber die Paramter und der Rückgabewert stimmen, jedenfalls wenn man nach dem ausggeht, das auf der Webseite angegeben ist ( BOOL IdleTrackerInit(); )

Was mach ich falsch? Wie kann ich den Fehler finden?

–Jan Vornberger

Hallo Jan

Declare Function IdleTrackerInit Lib „c:\PFAD\idletrac.dll“
Alias „IdleTrackerInit“ () As Boolean
ret = IdleTrackerInit()
Aber die Paramter und der Rückgabewert stimmen, jedenfalls
wenn man nach dem ausggeht, das auf der Webseite angegeben ist
( BOOL IdleTrackerInit(); )

Declare Function IdleTrackerInit Lib „c:\PFAD\idletrac.dll“
IdleTrackerInit() As Boolean
ret = IdleTrackerInit

  1. Evtl. musst du „Boolean“ durch „Integer“ oder Byte ersetzen. Den Typ „BOOL“ gibt es in C eigentlich nicht. Irgenwo muss im Header der DLL ein Eintrag „#define BOOL …“ stehen. Der Boolean-Typ in VB ist ein 32-Bit Wert, was aber für diese DLL verwendet wurde weiss ich nicht.
  2. VB6 mag keine leeren Klammern bei den aufrufen.

Vielen Dank für deine Hinweise, aber leider hat auch das ‚Herumraten‘ beim Rückgabewert nicht geholfen. Ich bekomme weiterhin die Einsprungfehlermeldung.

Lässt sich nicht irgendwie herausfinden, welche Funktionen (und wie sie zu handhaben sind) die DLL exportiert?

–Jan Vornberger

Hi Jan!

Der Fehler kommt etwa nicht durch einen falschen Typ des Rückgabewertes sondern durch die aufgerufene bzw. exportierte Funktion - der Eingangspunkt in das Library. Ich habe mir nun die DLL auch downgeloaded und konnte sie ebenfalls weder in der Registry registrieren noch unter VB via API benutzen. Ich habe mir auch den Source in VC++ angesehen und - obwohl ich VC-Beginner bin - scheint dieses Library nicht unter VB weiterverwendbar zu sein, da es keine Standard-COM-Schnittstellen bietet. Es ist also „nur“ eine C+±Ressource, die nur mit C++ verwendet werden kann.

Ich kann mich auch täuschen, aber die Hinweise und Fehlermeldungen sind fast eindeutig. Diese DLL kann man sicher „VB-fähig“ machen, doch da bin ich überfragt - wäre aber ein Posting im C+±Thread wert, oder?

Sorry, Stefan.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Jan,

ich hab’s mir auch mal angeschaut. Das Problem ist, daß die Funktionsnamen in der DLL Typinformationen enthalten. Die Einsprungpunkt heißt nicht

„IdleTrackerInit“

sondern

„?IdleTrackerInit@@YAHXZ

Die VB-Anweisung kann so aussehen:

Declare Function IdleTrackerInit Lib "[Pfad]\idletrac.dll" Alias "?IdleTrackerInit@@YAHXZ" () As Boolean

(Auf Groß-/Kleinschreibung achten!)

Alternativ geht auch die Nummer des Einsprungpunktes (hier Nr. 2):

Declare Function IdleTrackerInit Lib "[Pfad]\idletrac.dll" Alias "#2" () As Boolean

Nochmal der Inhalt der DLL:

Nr. 1
Name: "IdleTrackerGetLastTickCount"
Einsprungpunkt: "?IdleTrackerGetLastTickCount@@YAKXZ"
'
Nr. 2
Name: "IdleTrackerInit"
Einsprungpunkt: "?IdleTrackerInit@@YAHXZ"
'
Nr. 3
Name: "IdleTrackerTerm"
Einsprungpunkt: "?IdleTrackerTerm@@YAXXZ"

Ich habe mir die DLL übrigens mit Microsofts „Dependency Walker“ (depend.exe) angesehen, der bei den Dienstprogrammen des Visual Studio dabei ist. (Vielleicht gibt’s ihn auch so bei Microsoft)

Gruß, Ralf

Danke

„?IdleTrackerInit@@YAHXZ

Sowas! Und ich hab mich mit einem Hexeditor durch die DLL gehangelt und schließlich (mit großem Zweifel) „IdleTrackerInit@@YAHXZ“ ausprobiert! Funktionierte wegen dem fehlenden Fragezeichen natürlich nicht…

Vielen Dank! Sowohl für deine Arbeit, den Aufruf selber herauszufinden, als auch den Hinweis auf das Tool. So muss ich jetzt nicht jedesmal ‚rumnervern‘, wenn ich wieder ein ähnliches Problem habe :wink:

–Jan Vornberger