Crash direkt nach dem Start einer wx-Anwendung.
-
Grüss euch. Folgendes Problem:
..\..\src\common\init.cpp(65): assert "wxAssertFailure" failed in wxDummyConsoleApp::OnRun(): unreachable code
Call Stack:
[00] wxArrayLines::Remove
.. repeats..
[07] wxGDIObject::~wxGDIObject
[08] WinMain dtFuel\capp.cpp:23 (IMPLEMENT_APP(CApp) @ this line)
[09] _tmainCRTStartup
[10] WinMainCRTStartup
[11] RegisterWaitForInputIdleZur Erklärung:
Ich habe eine Game-DLL mit OpenGL-Klassen, in der ich wxWidgets verwende. Nein, nicht die GUI-Sachen, nur Klassen aus wxBase, wie wxString, wxXML etc.
Diese wird wie folgt initialisiert, ohne wxApp:// Windows DLL Main BOOL APIENTRY DllMain( HANDLE dll, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: { // Create SysLog dtSysLog::dtSysLogInstance = new dtSysLog(); assert(dtSysLog::dtSysLogInstance != NULL); // Initialize wxWidgets if (!wxInitialize()) { return FALSE; } return TRUE; } case DLL_PROCESS_DETACH: { // Cleanup dtDelete(dtSysLog::dtSysLogInstance); wxUninitialize(); return TRUE; } case DLL_THREAD_ATTACH: { return TRUE; } case DLL_THREAD_DETACH: { return TRUE; } }//switch return TRUE; dll; lpReserved; }
Ich hab wxWindows diese Woche nachträglich eingepflegt. Es gab keine größeren Probleme und all meine Programme die die DLL nutzen laufen wie sie sollen und ohne großen Speedverlust.
ABER:
Meine Tools sind jetzt dahin... die linken gegen wxWidgets und gegen meine GameDLL. Als Beispiel mein Shader-Designer. Der kommt gar nicht mehr bis zu wxApp::OnInit(), sondern stürzt mit obiger Fehlermeldung ab.
In Zeile 65 in der Datei init.cpp (von der wxSDK) steht folgender Code:// we need a dummy app object if the user doesn't want to create a real one class wxDummyConsoleApp : public wxAppConsole { public: wxDummyConsoleApp() { } virtual int OnRun() { wxFAIL_MSG( _T("unreachable code") ); return 0; } DECLARE_NO_COPY_CLASS(wxDummyConsoleApp) };
Ich verstehe daraus, dass die Lib denkt, dass meine Anwendung keine Instanz von wxApp erstellt hat, bzw findet diese nicht. Dem is aber nicht so..
Hat einer von euch eine Idee woran das liegen könnte?
Ich hab alle Binär-Dateien gegen den selben Build gelinkt, als Unicode-DLL mit aktiviertem OpenGL.
Ich bin mit meiner Weisheit am Ende... hoffe Ihr habt noch IdeenNachtrag: Ich verwende wxMSW 2.8.6
rya.
-
Hm, hab von dem Thema DLLs und wxWidgets noch keine große Erfahrung.
Aber ich denke es gibt einige Ansatzpunkte an denen du nachschauen solltest:1. benötigt die DLL eine eigene wxApp Instanz? (Imho nein)
-> Es gibt ein Macro um dies zu verhindern wxDECLARE_NO_APP oder so. (Suche im wxWidgets Forum könnte da helfen)2. Sind beide, die DLL und das Programm mit den selben einstellungen für wxWidgets gelinkt, bzw. über die selben Libraries?
3. Linkst du wxWidgets beides mal Statisch? (unwahrscheinlich, aber trotzdem möglich ;))
phlox
-
Oh danke Phlox für die Antwort aber ich hab das Prob mittlerweile gelöst. Sorry, dass ich das nicht reingeschrieben hab :). Es kam mir an einem Abend plötzlich wie ein Blitz.. also die Idee.
1. benötigt die DLL eine eigene wxApp Instanz? (Imho nein)
Nein, da ich in meiner GamedLL ja nur Basisklassen verwende und keine GUI. Aber sobald du mit wxInitialize() die Lib ansprichst, ist sie komischerweise auf deine Instanz gebunden. Da gibts dann so lustige Fehler wie "Class already registered" etc.2. Sind beide, die DLL und das Programm mit den selben einstellungen für wxWidgets gelinkt, bzw. über die selben Libraries?
Ja sicher.3. Linkst du wxWidgets beides mal Statisch? (unwahrscheinlich, aber trotzdem möglich ;))
Nein :D. Immer dynamisch mit wxUsingDLL.// Entry for Applications that don't use dtApp void DIESELTOOLEXPORT dtInitWx(HINSTANCE instance, wxApp* app) { int argc = 0; char** argv = NULL; wxSetInstance(instance); wxApp::SetInstance(app); wxEntryStart(argc, argv); }
Diese Funktion gibts jetzt innerhalb meiner DLL, für Anwendungen die nicht meine Klasse dtApp verwenden. Und das sind eben meine Tools, weil die eine wxWidgets-App brauchen. (Ich verwende die selbe Methode wie wxWidgets btw für meine App-Klasse) Die WinMain meiner DLL ist so geblieben.
Initialisiert werden meine Tools jetzt so:
BOOL WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { // EDIT: CFuel is a derived class from wxApp CFuel *dtFuel = new CFuel(); dtInitWx(hInstance, dtFuel); dtFuel->OnInit(); dtFuel->MainLoop(); delete dtFuel; return TRUE; } // Exit Mainloop void CMainframe::OnClose() { wxTheApp->ExitMainLoop(); }
Es gibt also kein IMPLEMENT_APP mehr und keine Speicherlecks.
Trotzdem danke nochmal für deine Antwort.
rya.