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

1

18.10.2008, 00:40

Konfigurationsdialog wird nicht geladen

Hallo zusammen.
Ich habe ein Problem mit den Beispielen aus Kapitel 3. Der Dialog für die Auswahl und Einstellungen des Adapters wird nicht geladen.
Wenn ich z.B. das erste Beispiel aus Kapitel 3 (01 - tbDirect3D) starten will kommt keine Fehlermeldung sondern es läuft alles wunderbar... siehe hier:

...
INFO: TriBase-Engine wird initialisiert... (tribase.cpp, Zeile 86, Funktion tbInit)
'tbDirect3D.exe': Loaded 'C:\Windows\System32\uxtheme.dll'
INFO: Initialisierung komplett! (tribase.cpp, Zeile 104, Funktion tbInit)
INFO: Der Konfigurationsdialog wird aufgerufen... (tbconfig.cpp, Zeile 1050, Funktion tbDoConfigDialog)
'tbDirect3D.exe': Loaded 'C:\Windows\System32\igdumd32.dll'
'tbDirect3D.exe': Unloaded 'C:\Windows\System32\igdumd32.dll'
WARNUNG: tbExit wurde nicht aufgerufen! Wird automatisch erledigt... (tribase.cpp, Zeile 48, Funktion DllMain)
INFO: TriBase-Engine wird heruntergefahren... (tribase.cpp, Zeile 113, Funktion tbExit)
INFO: Alle Speicherbereiche freigegeben! (tbmemory.cpp, Zeile 116, Funktion tbMemExit)
INFO: Herunterfahren abgeschlossen! (tribase.cpp, Zeile 149, Funktion tbExit)

Nur eben der Konfigurationsdialog taucht nicht auf und somit auch nicht das Fenster.
Ich sollte vielleicht noch sagen das alle Beispiele der vohergehenden Kapitel funktioniert haben :)
Das Problem konnte ich eingrenzen, und zwar ist nach dem aufrufen des Dialoges mit unten stehender Funktion in der tbConfig.cpp (Zeile 1066)

C-/C++-Quelltext

1
2
3
4
iResult = (int)(DialogBox(tb_g_DLLHandle,
                              MAKEINTRESOURCE(TB_IDD_CONFIG),
                              NULL,
                              ConfigDlgProc));

iResult = -1
Das heißt ja soviel wie Fehler :)
Nun krieg ich den Fehler aber nicht raus ... kann mir jemand helfen oder ist das Problem schonmal aufgetreten? Die Suche des Forums hat mir leider nicht geholfen.

Danke schonmal für die Hilfe
Gruß Matthias

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

18.10.2008, 00:50

Zitat von »"http://msdn.microsoft.com/en-us/library/ms645452.aspx"«

If the function fails for any other reason, the return value is –1. To get extended error information, call GetLastError.

This function typically fails for one of the following reasons:

  • an invalid parameter value
  • the system class was registered by a different module
  • The WH_CBT hook is installed and returns a failure code
  • if one of the controls in the dialog template is not registered, or its
  • window window procedure fails WM_CREATE or WM_NCCREATE

probiers mal mit GetLastError() ;)

3

18.10.2008, 03:49

Fehlercode ist 1813
"Der angegebene Ressourcentyp wurd nicht in der Image-Datei gefunden."

Das ist die Fehlermeldung dazu ... man hab ich nu lang da rumgefummelt :)
Also hab einige zeit gegoogelt die ausbeute war recht mager denke nu aber das es am übergebenen Handle liegt...
Ist aber alles mehr Spekulation als sonst was *grins* da ich mich kein bisschen mit der WINAPI und GUI auskenne. Brauche also nochmal ein wenig hilfe ;) nu is aber Zeit fürs Bett.

Nacht

P.S. Ich hab nichts an der Engine selbst gändert ist noch alles orginal. Vorher die Beispiele liefen ja nicht mit der Engine sondern über eine extra "Direct3DEnum", also mit

Quellcode

1
2
3
4
iResult = (int)(DialogBox(GetModuleHandle(NULL),
                              MAKEINTRESOURCE(IDD_DIRECT3D_SETTINGS),
                              NULL,
                              D3DEnumDialogProc));

laufen die andren Beispiele.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

18.10.2008, 11:40

Liegt der Code mit dem DialogBox() Aufruf in der triase.dll oder in deiner exe?

5

18.10.2008, 11:57

Der Dialog liegt in der dll.
Bis zum Ende von Kapitel 2 lagen alle Dialoge in der exe (funktionierte) und nun in der dll (funktioniert nicht)....

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

18.10.2008, 12:12

Dann isses klar: Das Problem liegt an GetModuleHandle(NULL).
GetModuleHandle(NULL) liefert dir einen Handle auf das Module das verwendet wurde um den aufrufenden Prozess zu erzeugen, also einen Handle auf die .exe!
Du brauchst aber einen Handle auf die dll, weil die Ressource ja dort drin is. Ein Weg dieses zu bekommen wäre z.b. dir das Handle das an DllMain() übergeben wird in einer globalen Variable zu merken und dieses an DialogBox zu übergeben...

7

18.10.2008, 13:32

Ich hab gerade gesehen ich hab den falschen code abgedruckt... Das GetModuleHandle(Null) hatte ich nur testweise drinn weil das so bei den Beispielen aus Kapitel zwei da stand. In der TribaseEngine ist das so:

C-/C++-Quelltext

1
2
3
4
    iResult = (int)(DialogBox(tb_g_DLLHandle,
                              MAKEINTRESOURCE(TB_IDD_CONFIG),
                              NULL,
                              ConfigDlgProc));

Definition (in tribase.cpp):

Quellcode

1
HMODULE     tb_g_DLLHandle = NULL;      // Handle der TriBase-DLL-Datei

Bzw:

C-/C++-Quelltext

1
extern HMODULE  tb_g_DLLHandle;         // Handle der TriBase-DLL-Datei


Sry war mein Fehler, war halt schon mitten in der Nacht :)

8

18.10.2008, 13:35

Das ist die dll Hauptfunktion die du ja meintest:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BOOL APIENTRY DllMain(HMODULE hModule, 
                      DWORD dwReasonForCall, 
                      LPVOID pvReserved)
{
    tb_g_DLLHandle = hModule;

    switch(dwReasonForCall)
    {
        case DLL_PROCESS_DETACH:
            if(tb_g_bInitCalled && !tb_g_bExitCalled)
            {
                TB_WARNING("tbExit wurde nicht aufgerufen! Wird automatisch erledigt...");
                tbExit();
            }
            break;
    }

    return TRUE;
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

18.10.2008, 14:05

und, funktionierts so jetzt oder net!?

10

18.10.2008, 14:11

Nein bekomme immer noch den Fehler...

Werbeanzeige