Problem beim "Tasten-Hook" aus der FAQ



  • Hallo,

    ich habe in der FAQ eine interessante Lösung gesehen, wie man die Tasten systemweit abfangen kann, leider bekomme ich es nicht hin dies nachzumachen.
    Beitrag: http://www.c-plusplus.net/forum/viewtopic.php?t=39145

    Ich beschreibe mal Schritt für Schritt meine Vorhergehensweise:

    1. Neu->DLL-Experte => ich kopiere den Quelltext in die Unit1.cpp
    2. Neu->Formular => ich nenne (Name) das Formular KeyHookForm, weils der Quelltext so verlangt und kopiere nun den Quelltext in die Unit2.h
    3. Ich kopiere den letzten Quelltext in die Unit2.cpp
    4. Projekt->Optionen->Compiler => Endgültig
    5. Ich kompiliere

    Heraus kommt eine Fehlermeldung und die DLL Project1.dll, die ich in keydll.dll umbenenne, was die Fehlermeldung aber nicht verschwinden lässt.

    Fehlermeldung:
    in Unit2.cpp
    -Fehler in der Deklaration
    -Qualifizierer 'TKeyHookForm' ist kein Name einer Klasse oder Struktur
    -Deklaration nicht ordnungsgemäß abgeschlossen

    Die Fehlermeldungen werden an den kommentierten Stellen gegeben:

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TKeyHookForm *KeyHookForm;  //+++Fehlermeldung hier+++
    
    extern "C" __declspec(dllexport) __stdcall void SetHook(void);
    extern "C" __declspec(dllexport) __stdcall void RemoveHook(void);
    extern "C" __declspec(dllexport) __stdcall DWORD CheckKey(int, WORD,LONG);
    
    //---------------------------------------------------------------------------
    __fastcall TKeyHookForm::TKeyHookForm(TComponent* Owner)   //+++Fehlermeldung hier+++
      : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TKeyHookForm::KeyHook(TMessage &Message)
    {
      char Key[80];
      GetKeyNameText(Message.LParam, Key, 80);
      ListBox1->Items->Add(Key);
    }
    //---------------------------------------------------------------------------
    void __fastcall TKeyHookForm::FormCreate(TObject *Sender)
    {
      SetHook();
    }
    //---------------------------------------------------------------------------
    void __fastcall TKeyHookForm::FormDestroy(TObject *Sender)
    {
      RemoveHook();
    }
    

    Ich hoffe Ihr könnt mir bei der Lösung meines Problems helfen, ich glaube ich habe die ganze DLL-Geschichte irgendwie falsch verstanden.

    gruß
    ravel



  • Hi,
    die unit2 von dir, sollte nicht in die DLL rein! Also erst DLL erstellen (komplieren) und dann NEU->ANWENDUNG und die Kode dann in die neue Unit kopieren! Dann müsste es klappen!

    MFG

    Alexander Sulfrian



  • Du brauchst 2 Projekte: ein DLL- und ein EXE-Projekt. Das DLL-Projekt kommt ganz ohne Forms aus.



  • Hallo!

    Vielen Dank, Ihr habt mir schon sehr geholfen, leider bekomme ich nun eine weitere Fehlermeldung, die da heißt:

    [Linker Fehler] Unresolved external 'SetHook' referenced from C:\PROGRAMME\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
    [Linker Fehler] Unresolved external 'RemoveHook' referenced from C:\PROGRAMME\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
    

    Sagt Euch das was?

    gruß
    ravel



  • Hast du die DLL-Lib zu deinem Projekt hinzugefügt?



  • Hallo!

    Du hast recht, ich habe vergessen die *.lib einzubinden, jetzt klappt alles! 🙂

    Vielen Dank!

    gruß
    ravel


Anmelden zum Antworten