Delphi-PRAXiS
Seite 1 von 3  1 23      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 Uhr.
Seite 1 von 3  1 23      

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