Wie kann ich Callback-Funktion in einer Klasse bekannt machen?



  • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    ➡
    int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
    Sollte es bringen 🙂



  • Ich programmiere unter Visual C++ Express 2008, WinAPI.

    Ich habe nun die Klasse umbenannt, auf MyWindow. Ich erstelle gar keine WinMain-Funktion, da ich dieses Programm als Engine verwende. Dann kann ich per #include die Dateien einlesen. Und dann erstelle ich eine WinMain-Funktion, daher konnte ich keine abstände machen zwieschen Klammer und HINSTANCE.

    Doch es gibt auch mit MyWindow noch die selben Fehler.

    Was habe ich denn falsch gemacht?



  • Okay, dann hast du ja eigentlich alles.

    Also in deiner CreateWindow.h sollte nun stehen:

    #ifndef CREATEWINDOW_H
    #define CREATEWINDOW_H
    
    #include <windows.h>
    
    class CWindow {
    	public:
    		HWND InitWindow (LPCTSTR, int, int, int, int);
    		LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    		int g_WindowWidth;
    		int g_WindowHeight;
    };
    
    const char g_szClassName [] = "My Window";
    
    CWindow Window;
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    #endif
    

    Und in deiner CreateWindow.cpp sollte stehen:

    #include "CreateWindow.h"
    
    HWND CWindow::InitWindow (LPCTSTR WindowTitle, int XPos, int YPos, int WindowWidth, int WindowHeight) {
        WNDCLASSEX wc;
        HWND hwnd;
    
        ZeroMemory (&wc, sizeof (WNDCLASSEX));
    
        wc.cbSize = sizeof (WNDCLASSEX);
        wc.style = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc = ::WndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = GetModuleHandle (NULL);
        wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wc.hCursor = LoadCursor (NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)GetStockObject (BLACK_BRUSH);
        wc.lpszMenuName = NULL;
        wc.lpszClassName = g_szClassName;
        wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    
        RegisterClassEx (&wc);
    
        hwnd = CreateWindowEx (0,
                               g_szClassName,
                               WindowTitle,
                               WS_VISIBLE | WS_EX_TOPMOST | WS_POPUP,
                               XPos, YPos,
                               WindowWidth, WindowHeight,
                               NULL,
                               NULL,
                               GetModuleHandle(NULL),
                               NULL);
    
        g_WindowWidth = WindowWidth;
        g_WindowHeight = WindowHeight;
    
        return 0;
    }
    
    LRESULT CALLBACK CWindow::WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch (msg)
        {
            case WM_DESTROY:
            {
                PostQuitMessage (0);
                return (0);
            } break;
        }
    
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
        return Window.WndProc(hwnd, msg, wparam, lparam);
    }
    

    Das Umbenennen der Klasse von CWindow in MyWindow war höchstwahrscheinlich unnötig, sorry, aber wusste mir da grad nicht weiterzuhelfen 🙂

    Nun hast du ja alles und so sollte alles passen. Natürlich wird aus diesen zwei Dateien keine EXE und auch keine LIB erzeugt (solange du nicht in den Projekteinstellungen angegeben hast, eine LIB zu erzeugen).

    Nun kannst du den Header CreateWindow.h in deine Programme includen, die Quelldatei CreateWindow.cpp deinen Projekten hinzufügen und somit deine Klasse CWindow in deinen Programmen verwenden.

    So, das müsste es gewesen sein.



  • Ich habe nun alles so übernommen, aber es gibt immer noch die selben Fehler.

    Wie kann man denn in den Projekteinstellungen auswählen, dass eine Lib erstellt werden soll?



  • Hast du die zwei Dateien in einem anderen Projekt verwendet, oder versuchst du Createwindow.cpp allein zu kompilieren (zu einer static library, was ich vorher flax LIB genannt habe)?

    Im ersten Fall kann ich dir nicht helfen. Wenn du in deiner main.cpp (dort wo die WinMain-Funktion deines Projekts steht) die Createwindow.h included hast und Createwindow.cpp dem Projekt hinzugefügt hast und noch eventuell benötigte Bibliotheken wie user32.lib und kernel32.lib dem Projekt mitgeteilt hast und du trotzdem noch Fehlermeldungen bekommst kann ich dir nicht helfen. Eigentlich müsste das funzen.

    Zweiter Fall: Du hast also ein Projekt erstellt, in dem nur die beiden Dateien Createwindow.h und Createwindow.cpp vorhanden sind. Daraus möchtest du wohl jetzt eine static library machen? Dafür musst du in deinen Projekteinstellungen nachsehen, "zu was dein Projekt kompiliert werden soll". In Codeblocks (der Entwicklungsumgebung, die ich verwende), sieht man beispielsweise ein Auswahlfeld, aus dem man wählen kann, ob man das Projekt zu einer

    -Konsolenanwendung
    -GUI-Anwendung
    -DLL
    -static library
    -nativ irgendwas
    -nur commands irgendwas

    kompilieren lassen möchte. Dort müsste man static library auswählen. Dann würde aus Createwindow.cpp (mit inkludierter Createwindow.h) nämlich die static library "libCreatewindow.a" kompiliert.
    Ich weiß nicht, wie das bei VC aussieht, aber da wird es wahrscheinlich eine ähnliche Einstellungsmöglichkeit geben, musst du halt mal gucken.

    Ich hoffe ich konnte dir ein bisschen weiterhelfen.



  • Nun habe ich eine static libary Anwendung gemacht. Jetzt gibt es keine Fehler mehr. Doch wenn ich nun diese Datei mit #include in einem anderen Projekt einlese, so kommen dort solche zwei Fehler:

    ------ Erstellen gestartet: Projekt: Engine Test, Konfiguration: Debug Win32 ------
    Verknüpfen...
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: struct HWND__ * __thiscall CWindow::InitWindow(char const *,int,int,int,int)" (?InitWindow@CWindow@@QAEPAUHWND__@@PBDHHHH@Z)" in Funktion "_WinMain@16".
    C:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\Engine Test\Debug\Engine Test.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\Engine Test\Engine Test\Debug\BuildLog.htm" gespeichert.
    Engine Test - 2 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    Weiss jemand warum?



  • Du musst Createwindow.h einbinden und libCreatewindow.a in den Linkeroptionen angeben. Also:

    In deiner main.cpp des neuen Projekts:

    #include "Createwindow.h"
    

    und in deinen Projekteinstellungen muss du unter den Linkeroptionen die Datei "libCreatewindow.a" (die von dir erstellte static library heißt doch so oder?) angeben.



  • Also, ich bin jetzt gerade nicht sicher, denn ich finde keine Datei mit .a Ich habe eine Ordner unter meinem Projektordner namens Debug. In diesem Ordner ist eine Datei namens MyEngine.lib (Object File Libary Datei). Und sonst sehe ich leider keine weitere Datein die mit .a enden.



  • Du musst wissen wie die Datei heißt die du vorher kompiliert hast, da kann ich jetzt nicht helfen. Aber glaube dass bei VC die static libraries alle die Endung .lib haben. Von daher ist vielleicht deine MyEngine.lib die gesuchte Datei.

    Codeblocks generiert standardmäßig static libraries mit der Endung .a, deshalb bin ich vorher davon ausgegangen, dass deine lib auch die Endung .a haben müsste. Naja, ist halt schwierig einen gemeinsamen Nenner zu finden wenn wir beide mit unterschiedlichen Entwicklungsumgebungen programmieren 🙂



  • mingw generiert *.a dateien
    m$ cl generiert *.lib dateien



  • scp57703 verwendest du Visual C++ Express 2008?

    Wenn ja, wo stellst du ein, das man eine static libary haben will? Ich habe zwar schon etwas gemacht, aber bin nun nicht ganz sicher, wegen wingw und m$ cl.


Anmelden zum Antworten