Unresolved external 'WinMain' in C0W32.OBJ (war: Fehlermeldung)



  • Also, bei TForm1::OnCreate wird eine Funktion aufgerufen die in einer DLL programmiert ist.
    bei TForm1::OnDestroy wird eine andere Funktion aufgerufen, die ebenfalls in dieser DLL programmiert ist. Die eine aktiviert und die andere deaktiviert etwas, das sich Hook nennt.
    Die Funktionen sind angelegt, nur ob sie funktionieren weiss ich nicht, da ich ja diese Fehlermeldung bekomme.

    Ich habe ehrlich gesagt zwar keine Ahnung von _main()- oder WinMain()-Funktionen (bzw. ich weiss nicht wirklich was es sein soll), aber programmieren an sich kann ich eine menge.

    Ich schätze jetzt einfach mal, dass eine _main()-Funktion ein (Bsp.:) OnButtonClick ist, liege ich da richtig?

    Wenn ja hat das Programm also _main()- oder WinMain()-Funktionen.

    Gruß
    MWJK



  • MWJK schrieb:

    Ich habe ehrlich gesagt zwar keine Ahnung von _main()- oder WinMain()-Funktionen (bzw. ich weiss nicht wirklich was es sein soll)

    Dann glaub mir einfach und lies ein Tutorial durch. Für C und C++ ist das Basiswissen, und solches ist am ehesten in Tutorials zu finden. Auch wenn du meinst, schon darüber hinaus zu sein, tu es einfach 😉

    MWJK schrieb:

    Ich schätze jetzt einfach mal, dass eine _main()-Funktion ein (Bsp.:) OnButtonClick ist, liege ich da richtig?

    Nein. TButton::OnClick ist ein Ereignishandler (technisch gesehen ein an ein konkretes Objekt gebundener Methodenzeiger - Borland nennt das "Closure"); die Funktion, auf die dieser Ereignishandler verweist, wird aufgerufen, sobald das Ereignis eintritt (in diesem Fall: Klick auf den Button). Die main()-Funktion (der Unterstrich davor wird vom Compiler automatisch hinzugefügt und braucht dich nicht zu stören, du definierst die Funktion trotzdem als main()) wird aufgerufen, wenn das Programm gestartet wird. Auch jedes normale C++Builder-Projekt hat eine solche Funktion, sie ist für gewöhnlich in der .cpp-Datei untergebracht, die den gleichen Namen trägt wie das Projekt. Schau doch nach, wenn du mir das nicht glaubst 😉



  • Okay, hast mich überredet.

    Habe also mal angefangen in einem Tutorial zu lesen und nach deinem letzten Posting nochmal mein Programm durchforstet und nun hat es eine WinMain-Funktion.

    Allerdings bekomme ich jetzt zwei neue Fehler ... so langsam dreh ich durch ...
    Wie kann ich denn eine *.obj-Datei verändern, ohne sie zu beschädigen?

    Danke schonmal.

    Gruß
    MWJK



  • MWJK schrieb:

    Okay, hast mich überredet.

    👍

    MWJK schrieb:

    Wie kann ich denn eine *.obj-Datei verändern, ohne sie zu beschädigen?

    Prinzipiell geht das mit einem Hex-Editor, aber ich würd's lassen. Wenn du was ändern willst, tu das in der Quelltextdatei und kompiliere neu.

    Vielleicht könntest du auch dein aktuelles Problem genauer beschreiben...



  • Klar kann ich:

    also, habe mein WinMain Funktion so angelegt:

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            try
            {
                     Application->Initialize();
                     Application->CreateForm(__classid(TKeyHookForm), &KeyHookForm);
                     Application->Run();
            }
            catch (Exception &exception)
            {
                     Application->ShowException(&exception);
            }
            return 0;
    }
    

    , da kommen aber zwei Fehler:

    [C++ Fehler] keyhook.cpp(13): E2303 Typname erwartet

    an der Stelle:

    Form), &Key

    zwischen ')' und ','.

    und:

    [C++ Fehler] keyhook.cpp(13): E2121 ) fehlt beim Funktionsaufruf

    hinter dem Semikolon am Ende der Zeile

    Application->CreateForm(__classid(TKeyHookForm), &KeyHookForm);

    ...ich weiss, dass KeyHookForm eigentlich Form1 ist, dann kommen aber die Fehler, dass Form1 in der "keyhook.obj" nicht gefunden werden kann, also habe ich es so geändert (so heisst es in meinem Programm auch) und nun bekomme ich diese Fehler.

    Gruß
    MWJK



  • Was du da hineingeschrieben hast, braucht der C++Builder nur zur VCL-Initialisation. Wenn du ein VCL-Projekt anlegst, erstellt er das automatisch, wenn du eine Konsolen- oder Win32-GUI-Anwendung erstellst, ist das nicht nötig, da du die VCL ja nicht verwendest. Was in die Funktion hineinkommt, mußt du selbst entscheiden: was drinsteht, wird ausgeführt. Wenn sie leer ist, macht das Programm eben gar nichts.

    Edit: Willst du da eine .EXE oder eine .DLL kompilieren? Eine DLL hat nämlich noch eine andere Einsprungfunktion (die aber vom DLL-Experten automatisch erstellt wird).



  • Dort will ich eine .exe kompilieren.

    heisst das, dass da nun TForm1 stehen muss, oder der Name der Form?

    Gruß
    MWJK



  • Wieso TForm oder Form1? Du verwendest die VCL doch gar nicht.
    Da muß eben das stehen, was beim Programmstart passieren soll.

    Sorry, aber irgendwie kann ich nicht so recht glauben, daß du damit dein Brot verdienst...



  • audacia schrieb:

    Wieso TForm oder Form1? Du verwendest die VCL doch gar nicht.
    Da muß eben das stehen, was beim Programmstart passieren soll.

    Sorry, aber irgendwie kann ich nicht so recht glauben, daß du damit dein Brot verdienst...

    Dort habe ich das mit drin stehen:

    Application->CreateForm(__classid(TKeyHookForm), &KeyHookForm);

    wobei KeyHookForm der Name der TForm1 ist.
    und normalerweise heisst das ja Form1 und das stand da auch anfangs drin, bis ich es TKeyHookForm genannt habe.

    nun wollte ich wissen, ob da TForm1 drin stehen muss, oder TKeyHookForm.

    Gruß
    MWJK



  • Jetzt mal langsam. Kannst du mal einen Link zu dem Beispiel, das du testen willst, posten?

    Wenn das Beispiel die VCL verwendet, mußt du das freilich auch tun, dann solltest du über Datei|Neu|Weitere... die VCL-Formularanwendung auswählen.



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-39145.html

    das ist der Link zur Einbauanleitung. Dieses Programm fängt die Tastenanschläge systemweit ab und gibt sie aus. das ganze nennt sich Hook.

    Das wollte ich dann nicht so belassen, sondern weiterverwenden, aber es funzt ja nichmal.

    Gruß
    MWJK



  • MWJK schrieb:

    Das wollte ich dann nicht so belassen, sondern weiterverwenden, aber es funzt ja nichmal.

    Doch, das funktioniert schon, zumindest bei mir 😉

    Wenn du folgendes tust, sollte es auch bei dir klappen:
    - DLL wie vorgeschrieben kompilieren (da solltest du auf keine Probleme stoßen)
    - eine neue VCL-Formularanwendung anlegen (vorzugsweise in der gleichen Projektgruppe)
    - du benennst das Formular in "KeyHookForm" um
    - du setzt eine ListBox auf das Formular und beläßt es vorerst beim Defaultnamen (ListBox1)
    - mit dem Methoden-Experten fügst du eine neue Methode namens KeyHook mit einem Parameter "TMessage& Message", der Aufrufkonvention __fastcall und dem Rückgabewert void ein. In den Methodenrumpf trägst du folgendes ein:

    char Key[80];
      GetKeyNameText(Message.LParam, Key, 80);
      ListBox1->Items->Add(Key);
    

    - in der Formular-Headerdatei fügst du folgendes nach "private:" ein:

    BEGIN_MESSAGE_MAP
          MESSAGE_HANDLER(WM_KEYHOOK, TMessage, KeyHook);
        END_MESSAGE_MAP(TForm);
    

    - in der .cpp-Datei fügst du nach der Definition des Formularobjekts das hier ein:

    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);
    

    - abschließend erstellst du über den Objektinspektor Handlerroutinen für die Ereignisse "OnCreate" und "OnDestroy", in deren Methodenrümpfe du

    SetHook();
    

    bzw.

    RemoveHook();
    

    einträgst.

    Und schon funktionierts 😉



  • Komisch, wenn ich das genau so mache, dann kommt wieder der Fehler mit der WinMain .....

    kA was ich falsch mache ....





  • mein teil war doch gar nict off topic.



  • Er ist OffTopic, und das ist hier keine Einladung zur Diskussion, weitere diesbezügliche Beiträge werden kommentarlos gelöscht.


Anmelden zum Antworten