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

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

1

24.05.2008, 20:14

tbExit: wenn es nicht aufgerufen wird

Also wenn tbExit mal nicht aufgerufen wird, dann erledigt das ja die DLL.
Das klappt auch ganz gut. :)
tbDirect3D::Exit allein vergessen macht auch keine Probleme

ABER wenn tbExit und tbDirect3D::Exit vergessen werden, kommt es zum Laufzeitfehler,
bei "m_pD3DDevice->SetTexture(dwStage, NULL);"
tbDirect3D.cpp, Zeile 295 ('Exit()', Zeile 11)

Hat einer von euch ne Idee was da schief geht? :(
Der Debugger sagt dass sich m_pD3DDevice seit Init nicht verändert hat, und dwStage ist 0 als der Fehler kam

Ich habe das gleiche Problem auch in meiner Engine, und habe getestet ob es mit TriBase ganauso ist: positiv

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

2

25.05.2008, 10:10

Also ich habe was interessantes im Debug-Protokoll gefunden:

Quellcode

1
2
3
4
5
6
7
8
...
tribase.dll geladen
...
d3d37.dll geladen
...
d3d37.dll entladen
...
tribase.dll entladen...


Ich glaube, dass folgendes passiert:

Quellcode

1
2
3
4
5
6
7
8
...
d3d37.dll entladen
...
tribase.dll soll entladen werden
DllMain wird aufgerufen mit DLL_PROCESS_DETACH
es wird festgestellt, dass die Engine nicht heruntergefahren wird -> tbExit
hier ist tbDirect3D noch nicht heruntergefahren -> tbD3D::Exit
und hier gibts nen Fehler: die Funktion SetTexture ist bereits entladen, wird aber trotzdem aufgerufen -> CRASH :!: 


Das Problem ist imho, dass D3D eher entladen wird als TriBase.
Das müsste eigentlich gelöst werden können, afaik 3 Möglichkeiten:
1) Irgentwas einstellen, dass Tribase.dll als letzte geladen und als erste entladen wird (ist find ich die bessere), damit noch Funktionen aus den anderen DLLs benutzt werden können
2) WinMain schon in TriBase definieren, und von dort aus die Funktion tbMain aufrufen, die der Programmierer definiert hat.
3) alles statisch linken ( :x )

Ich würde 1) bevorzugen.

Hat einer von euch eine Idee, wie ich das hinbekommen könnte :cry:
(vieleicht per manifest?)

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

3

25.05.2008, 16:00

Warum rufst du am Ende der WinMain nicht einfach tbExit auf?
Ich finde auch, dass das mit dem automatischen Aufruf in der DllMain alles andere als sinnvoll ist, da man den Code von DllMain auf ein Minimum beschränken sollte. DllMain wird nämlich intern durch eine CriticalSection geschützt, was zur Folge hat, dass neue Threads nicht ausgeführt werden, Load/FreeLibrary blockieren und damit eigentlich jeder Aufruf einer API (DX zB) das Programm potentiell blockieren kann.

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

4

25.05.2008, 18:11

Mir geht es eigentlich um eine Art Notlösung, falls das Programm mal abstürzen sollte.
Damit kann ich wenigstens noch ein bisschen aufräumen.

Ich hätte jetzt folgenden Ansatz:
Die DLLs werden automatisch zu Programmbeginn geladen, wie bisher.
Nur wird das Entladen aller DLLs jetzt von DLLMain in TriBase.dll erledigt.
Und nicht automatisch.

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

5

26.05.2008, 17:12

Hat sich gelöst: SetUnhandledExceptionFilter

Danke trotzdem!

Werbeanzeige