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



  • 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