Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

1

28.04.2007, 21:18

[WinAPI] Fenster aus DLL erzeugen

Ich bin mal wieder am verzweifeln. Eigentlich wollte ich nur eine relativ simple Fensterklasse für meine DirectSound und DirectGraphics Klassen erzeugen um nicht immer mit HWNDs hantieren zu müssen. Einziger Knackpunkt: Die Klasse soll in eine DLL. Also vorher schlau gemacht und festgestellt das ich WNDCLASSEX und CreateWindow das Modul Handle der DLL übergeben muss. Sollte ja eigentlich kein Problem sein. Ich bin dann bei folgendem Code gelandet:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Window::Window(const std::string title, int sizeX, int sizeY)
    {
        mHandle = NULL;
        #ifdef _DEBUG
        mHInstance = GetModuleHandleA("GxLib_d.dll");
        #else
        mHInstance = GetModuleHandleA("GxLib.dll");
        #endif
        char classname[] = "GxWindowxClass";

        // Registering the window class

        WNDCLASSEXA wc;

        wc.cbSize        = sizeof(WNDCLASSEXA);
        wc.style         = CS_CLASSDC;
        wc.lpfnWndProc   = Window::MsgProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = mHInstance;
        wc.hIcon         = LoadIcon(mHInstance, IDI_APPLICATION);
        wc.hCursor       = LoadCursor(mHInstance, IDC_ARROW);
        wc.hbrBackground = NULL;
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = classname;
        wc.hIconSm       = LoadIcon(mHInstance, IDI_APPLICATION);

        if(!RegisterClassExA(&wc))
             MessageBox(NULL, L"Window Registration Failed!", L"Error!", MB_ICONEXCLAMATION | MB_OK);

        // Creating the applications window

        mHandle         = CreateWindowA(classname, classname, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, sizeX, sizeY,
                                        NULL, NULL, mHInstance, NULL);

        if(!mHandle)
        {
            DWORD err = GetLastError();
            MessageBox(NULL, L"HWND is bad!", L"Error!", MB_ICONEXCLAMATION | MB_OK);
        }

        ShowWindow(mHandle, SW_SHOWDEFAULT);
        UpdateWindow(mHandle);
    }
Stil ist völlig nebensache, ich hab da mit sovielen verschiedenen Ansätzen aus tausendundeiner Googlequelle dran rumgefummelt das mir erstmal ALLEs total egal ist.

Das Problem liegt in der CreateWindowA Funktion. Diese liefert einen Nullpointer zurück und weigert sich offenbar einen Fehler auszugeben. Zumindest liefert GetLastError() immer nur 0 zurück.

Ich hoffe beinahe ich mache irgendeneinen total offensichtlichen Fehler, aber nach knapp 2 Stunden starren auf diesen Code bin ich nervlich irgendwie angespannt. Vllt findet ihr ja was?

Edit:
Verdammt, falscher "Sonstiges" Bereich.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

28.04.2007, 21:25

Die Klasse Window soll in eine Dll und wird aus deiner Applikation aufgerufen? Und was hat GxLib.dll damit zu tun? Hab irgendwie nich ganz durchgeblickt bei deiner Erklärung! :)
@D13_Dreinig

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

3

28.04.2007, 21:27

Die Klasse Window ist schon Teil dieser DLL. Mein "Testprogramm" sieht einfach so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <GxLib.h>

// MSVC++ only

#ifdef _DEBUG
#pragma comment(lib, "GxLib_d.lib")
#else
#pragma comment(lib, "GxLib.lib")
#endif

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
    GX::Window* window = new GX::Window("Test", 400, 400);

    while(window->doMessagePump())
    {

    }
}

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

28.04.2007, 21:47

Versuch mal GetModuleHandle( NULL )
@D13_Dreinig

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

5

28.04.2007, 21:52

Dann krieg ich das HINSTANCE der exe, klappt auch net. Sollte laut diesem Blogeintrag ja auch falsch sein: http://blogs.msdn.com/oldnewthing/archive/2005/04/18/409205.aspx

Ich ruf RegisterClassEx ja aus einer Methode der DLL auf.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

28.04.2007, 21:53

Bei mir tuts! :-)
@D13_Dreinig

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

7

28.04.2007, 21:55

Das ist pervers. Ich krieg dann von der CreateWindow Funktion immernoch einen Nullpointer zurück :(

Edit:
Hast du 1 zu 1 meinen Code genommen? Vllt hab ich in den Projekteinstellungen was falsch Oo Glauch ich zwar nicht aber hey, who knows ...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

28.04.2007, 22:07

Nein, hab ein eigenes Projekt gemacht.
@D13_Dreinig

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

9

28.04.2007, 22:50

Ich muss nochmal nachfragen: Ein oder zwei Projekte? Mein Problem ist nicht das der Code da oben völlig falsch ist, sondern das zusammenspiel mit der DLL.

Wenn ich die Classe Window mit in die .exe packe, also nur ein Projekt habe ist alles eitel Sonnenschein. Bastel ich die Klasse Window aber in ein dazugehöriges DLL Projekt ist Ende. CreateWindow liefert dann eben immer 0 zurück.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

28.04.2007, 23:03

Zwei Projekte statisch gelinkt.
@D13_Dreinig

Werbeanzeige