Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Verzweifel an DLL (https://www.delphipraxis.net/24355-verzweifel-dll.html)

HaCkAttaCk2001 19. Jun 2004 20:14


Verzweifel an DLL
 
Hi.

Ich habe mir jetzt über 10 verschiedene Beiträge zu Exports, 'external' und DLLs angeschaut... aber ich finde einfach nicht heraus wieso ich die Fehlermeldung: "Der Prozedureinsprungpunkt "DisableTaskKeys" wurde in der DLL "TaskKeyHook.dll" nicht gefunden." bekomme.

Hier der Delphi-Code mit dem ich die Funktion einbinde:

Code:
function DisableTaskKeys(bDisable, bBeep : boolean) : boolean; stdcall;
  external 'TaskKeyHook.dll';
(Die DLL existiert natürlich.)

Und hier der relevante Codeausschnit der DLL (C++):

Code:
DLLEXPORT BOOL DisableTaskKeys(BOOL bDisable, BOOL bBeep)
{
   if (bDisable) {
      if (!g_hHookKbdLL) {
         g_hHookKbdLL = SetWindowsHookEx(WH_KEYBOARD_LL,
            MyTaskKeyHookLL, MyDll.m_hInstance, 0);
      }

   } else if (g_hHookKbdLL != NULL) {
      UnhookWindowsHookEx(g_hHookKbdLL);
      g_hHookKbdLL = NULL;
   }
   g_bBeep = bBeep;

   return AreTaskKeysDisabled();
}
Ich habe gerade erst angefangen mit DLLs zu hantieren, also bitte nicht schimpfen, dass ich so blöd bin :| (falls ich irgendeinen dummen Fehler gemacht hab...).


C ya.

Meflin 19. Jun 2004 20:45

Re: Verzweifel an DLL
 
also dass die dll in c ist machts nicht einfacher da ich nicht sagen kann ob der code stimmt. prinzipiell heisst die fehlermeldung das was du willst gibts nicht. versuchs mal ohne stdcall... vielleicht gehts dann!

w3seek 19. Jun 2004 21:24

Re: Verzweifel an DLL
 
Bist du dir sicher dass du die funktion auch exportierst in der DLL? Zudem stelle sicher dass die funktion mit STDCALL in deiner DLL deklariert ist.

Christian Seehase 19. Jun 2004 21:37

Re: Verzweifel an DLL
 
Moin HaCkAttaCk2001,

also die genannte Fehlermeldung sagt i.d.R. genau das aus, was der Fehler ist, sprich:
Unter dem Namen, unter dem Du die Funktion importieren willst, kann sie in der DLL nicht gefunden werden.

Wichtig ist immer, dass die Gross-/Kleinschreibung exakt eingehalten werden muss.
Um den C-typischen Booltyp zu verwenden, müsstest Du übrigens Longbool nehmen, nicht boolean.

Leider bin ich nicht C(++) fest genug, um entscheiden zu können, ob die Funktion wirklich unter dem Namen exportiert wird, den Du für den Import angegeben hast. Eventuell wird die Funktion auch nur über ihren Indexwert in der Exporttabelle exportiert, so dass Du sie überhaupt nicht mit Namen importieren kannst.

Ein Import könnte z.b. so aussehen:

Delphi-Quellcode:
// Hier wird der Name selbst mit angegeben
// wie die Delphi Funktion heisst spielt dann keine Rolle
function DTK(const bDisable : Longbool;const bBeep : Longbool) : Longbool; stdcall; external 'TaskKeyHook.dll' name 'DisableTaskKeys';

// oder über den Index (in diesem Beispiel frei erfundener Wert)
function DTK(const bDisable : Longbool;const bBeep : Longbool) : Longbool; stdcall; external 'TaskKeyHook.dll' index 42;

// Hier muss der Name unter dem die Funktion exportiert wird
// exakt so heissen, wie der Delphi Funktionsname.
function DisableTaskKeys(const bDisable : Longbool;const bBeep : Longbool) : Longbool; stdcall; external 'TaskKeyHook.dll';
Schau Dir doch die DLL mal mit dem Bei Google suchenDependency Walker an.

HaCkAttaCk2001 19. Jun 2004 21:42

Re: Verzweifel an DLL
 
Hi.

Der Dependency Walker sagt, die Funktion wäre: int DisableTaskKeys(int,int) . Eigentlich genau das, was ich oben auch stehen habe, oder?

PS: Der DLL-Source-Code stimmt unter Garantie. Denn der ist aus der Microsoft MSDN, wenn ich mich nicht täusche. Daran wollte ich üben, wie ich sowas einbinden kann. Aber das sich das als so schwer herausstellt...

Edit: Ich hatte nun noch irgendeine Schutzverletzung... die hab ich wegbekommen indem ich stdcall; weggelassen habe. Die exportierte Funktion funktioniert (fast - siehe unten!) einwandfrei!!

Ich möchte allen die mir geholfen haben herzlich danken! (Und mir vllt. noch bei dem Problem weiter unten helfen ;)

Hier die Lösung:

Das war der finale Code:
Code:
function DisableTaskKeys(const bDisable : Longbool; const bBeep : Longbool) : Longbool;
  external 'TaskKeyHook.dll' index 2;

C ya!

Christian Seehase 19. Jun 2004 21:50

Re: Verzweifel an DLL
 
Moin HaCkAttaCk2001,

:shock:

dann solltest Du mal überprüfen wie oft und wo die DLL auf Deinem Rechner auftaucht.
Ich kann mir nur noch vorstellen, dass das System beim Programmstart eine andere DLL einbindet, als Du mit dem Dependeny Walker geprüft hast.

[EDIT]
Oder probier mal die Funktion über ihren Index zu importieren.
[/EDIT]

w3seek 19. Jun 2004 21:51

Re: Verzweifel an DLL
 
Zitat:

Zitat von Christian Seehase
Ein Import könnte z.b. so aussehen:

Delphi-Quellcode:
// Hier wird der Name selbst mit angegeben
// wie die Delphi Funktion heisst spielt dann keine Rolle
function DTK(const bDisable : Longbool;const bBeep : Longbool) : Longbool; stdcall; external 'TaskKeyHook.dll' name 'DisableTaskKeys';

// oder über den Index (in diesem Beispiel frei erfundener Wert)
function DTK(const bDisable : Longbool;const bBeep : Longbool) : Longbool; stdcall; external 'TaskKeyHook.dll' index 42;

// Hier muss der Name unter dem die Funktion exportiert wird
// exakt so heissen, wie der Delphi Funktionsname.
function DisableTaskKeys(const bDisable : Longbool;const bBeep : Longbool) : Longbool; stdcall; external 'TaskKeyHook.dll';

wenn du die parameter mit const deklarierst, werden sie als referenz uebergeben. dann haette die funktion aber so deklariert werden muessen:

BOOL STDCALL
DisableTaskKeys(BOOL *bDisable, BOOL *bBeep);

w3seek 19. Jun 2004 21:53

Re: Verzweifel an DLL
 
Zitat:

Zitat von Christian Seehase
Oder probier mal die Funktion über ihren Index zu importieren.

Ich wuerde diese Variante nicht empfehlen, denn wenn man den Index (versehentlich) aendert, wundert man sich auf einmal warum das programm nicht mehr richtig funktionieren will ;)

HaCkAttaCk2001 19. Jun 2004 21:55

Re: Verzweifel an DLL
 
Zitat:

Zitat von w3seek
Zitat:

Zitat von Christian Seehase
Oder probier mal die Funktion über ihren Index zu importieren.

Ich wuerde diese Variante nicht empfehlen, denn wenn man den Index (versehentlich) aendert, wundert man sich auf einmal warum das programm nicht mehr richtig funktionieren will ;)

Hi.

Der Index (also in der DLL) bleibt von mir unangetastet ;) .

Damit entfällt dieses Problem...

Christian Seehase 19. Jun 2004 21:55

Re: Verzweifel an DLL
 
Moin w3seek,

aber damit könnte man sicherstellen, dass die Funktion tatsächlich enthalten ist, nur offensichtlich nicht unter dem Namen exportiert wird, sondern eventuell decorated.

w3seek 19. Jun 2004 21:59

Re: Verzweifel an DLL
 
Zitat:

Zitat von Christian Seehase
aber damit könnte man sicherstellen, dass die Funktion tatsächlich enthalten ist, nur offensichtlich nicht unter dem Namen exportiert wird, sondern eventuell decorated.

Wenn der Dependency Walker sagt dass die Funktion unter dem namen exportiert ist, muss man sie auch mit diesem Namen importieren koennen. Da kann der nicht sagen die funktion konnte er nicht finden...

Christian Seehase 19. Jun 2004 22:01

Re: Verzweifel an DLL
 
Moin w3seek,

würde ich auch denken, scheint aber nicht der Fall zu sein ;-)

w3seek 19. Jun 2004 22:02

Re: Verzweifel an DLL
 
[edit]
sorry, doppelposting ;)
[/edit]
Trotzdem, irgendwas muss faul sein, ich hab schon oefters dlls mit c (mit gcc kompiliert) geschrieben und diese auch mit delphi importiert, das funktioniert einwandfrei. Wenn dependency walker sagt die funktion wird exportiert dann muss man sie auch importieren koennen. Egal welche DLL ;)

HaCkAttaCk2001 19. Jun 2004 22:05

Re: Verzweifel an DLL
 
Hi.

Etwas geht doch noch nicht... ich füg mal alles als Zip-Datei an, damit ihr mir helfen könnt (ist ja kein vertraulicher Code, sondern Übungscode).

Folgendes Problem: Das Sperren des Taskswitchens zur Laufzeit klappt bestens. Allerdings kann ich es nicht wieder abschalten, obwohl dies möglich sein soll (wofür sonst das LongBool...). Ich hab auch mal den C++ Source der DLL mit in das Archiv getan.


Wie kann man das Problem lösen?


C ya!

[edit=Christian Seehase]Attachement gelöscht. Mfg, Christian Seehase[/edit]

w3seek 19. Jun 2004 22:14

Re: Verzweifel an DLL
 
Zitat:

Zitat von HaCkAttaCk2001
[edit=Christian Seehase]Attachement gelöscht. Mfg, Christian Seehase[/edit]

huh....hab ich was verpasst?

Christian Seehase 19. Jun 2004 22:22

Re: Verzweifel an DLL
 
Moin w3seek,

Zitat:

Zitat von w3seek
huh....hab ich was verpasst?

nicht wirklich. ;-)
Ich denke mal, dass HaCkAttaCk2001 das korrigierte Attachement noch hochladen wird.

BTW:
Die Funktion wird decorated exportiert und der Dependency Walker zeigt ?DisableTaskKeys@@YAHHH@Z an.

w3seek 19. Jun 2004 22:24

Re: Verzweifel an DLL
 
Zitat:

Zitat von Christian Seehase
Die Funktion wird decorated exportiert und der Dependency Walker zeigt ?DisableTaskKeys@@YAHHH@Z an.

Ok dann wundert mich das nicht, dass er die Funktion nicht finden kann. Ist die Funktion korrekt in der .def und/oder .edf eingetragen?

w3seek 19. Jun 2004 22:31

Re: Verzweifel an DLL
 
http://msdn.microsoft.com/library/de...hod_to_use.asp

nur so als Lektuere-empfehlung

HaCkAttaCk2001 19. Jun 2004 22:38

Re: Verzweifel an DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi.

Äh, wieso wurde das Attachment gelöscht?! Ich werd aus den Postings nicht schlau ^^.

Und wie muss ich die decorated Funktion nun aufrufen? Denn wenn ich das wortwörtlich hinschreibe, meckert Delphi über die Zeichen... (bin ein Noob, i'm so sorry :stupid: ).

C Ya!.

PS: War das Attachment vllt. kaputt? Habs nochmal angehangen.

Edit: Aber wenn du herausfinden konntest, das die Funktion decorated ist, hast du entweder die Datei retten können, hast in MSDN gesucht, oder die Datei war ganz... lasst mich nicht so im dunkeln stehn ^^ . Wenn ich was falsch gemacht hab, sagt's bitte ;) .

Edit2: Copyright auf Übungsressourcen? Oh sry. Moment ich lad nur das Delphi-Zeugs hoch... die DLL-Sources müsst ihr euch halt selbst holen... den Link poste ich gleich.

http://msdn.microsoft.com/msdnmag/is...A/default.aspx . Die Sources sind oben zum download.

w3seek 19. Jun 2004 22:45

Re: Verzweifel an DLL
 
Hab leider kein Visual C++, allerdings braeuchtest du eine .def datei. Les dir mal folgendes durch: http://msdn.microsoft.com/library/de....def_files.asp

Christian Seehase 19. Jun 2004 23:04

Re: Verzweifel an DLL
 
Moin HaCkAttaCk2001,

wenn Du zusätzlich den Namen mit angibst (siehe erste Variante) dann sollte es so klappen:

Delphi-Quellcode:
function DTK .... ; external 'taskkeyhook.dll' name '?DisableTaskKeys@@YAHHH@Z';

w3seek 19. Jun 2004 23:28

Re: Verzweifel an DLL
 
naja davon wuerd ich wirklich abraten, dann doch lieber per index...

HaCkAttaCk2001 19. Jun 2004 23:28

Re: Verzweifel an DLL
 
Zitat:

Zitat von Christian Seehase
Moin HaCkAttaCk2001,

wenn Du zusätzlich den Namen mit angibst (siehe erste Variante) dann sollte es so klappen:

Delphi-Quellcode:
function DTK .... ; external 'taskkeyhook.dll' name '?DisableTaskKeys@@YAHHH@Z';

Hi.

Ja, das funktioniert genauso gut wie mit Index 2. Ist vllt. nur ein wenig sicherer...

Aber wie bekomme ich nun den Fehler weg, dass sich das ganze nicht wieder "entsperren" lässt? Einfach von (true,true) auf (false,false) zu setzen, scheint nicht zu funktionieren... muss ich die DLL da wieder entladen?!


C ya.

HaCkAttaCk2001 22. Jun 2004 17:27

Re: Verzweifel an DLL
 
Hi.

Hat keiner weiter ne Idee oder sollte ich dafür lieber einen neuen Thread aufmachen?


C Ya!

PS: Sorry für's pushen :) .

Christian Seehase 22. Jun 2004 22:09

Re: Verzweifel an DLL
 
Moin HaCkAttaCk2001,

nachdem ich mir Dein ungelöstes Problem noch einmal angeschaut habe, komme ich zu dem Schluss, dass ein neuer Thread hier wohl angebracht wäre.

Zitat:

Zitat von HaCkAttaCk2001
PS: Sorry für's pushen :) .

Danke für Deine Rücksicht, aber nach jetzt über 24 Stunden, ist pushen ja durchaus akzeptabel.

NicoDE 22. Jun 2004 23:10

Re: Verzweifel an DLL
 
Wenn Du in Delphi die Aufrufkonvention wegläßt, dann wird register verwendet (Borland-spezifische Aufrufkonvetion, welche die Register als Parameter benutzt, aber nicht zu Microsofts __fastcall kompatibel ist).
Bei C/C++ ist die Standard-Aufrufkonvention __cdecl.

Ich würde dazu tendieren die Funtionen in MSVC als __stdcall und "extern C", und in Delphi als stdcall zu deklarieren.
Zudem wäre es nützlich eine foo.def (passend zur foo.cpp) in das MSVC-Projekt auzunehmen, in der die Funktioen im Export-Abschnitt definiert werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz