From: <sr...@op...> - 2003-11-24 21:23:13
|
First, thanks to Andrew and Ian for solving the "can't link in MSVS" problem- it turns out I was linking against the multithreaded debug *static* libraries, after all. Now, I'm trying to use vgui from within an MFC application. The mfc_example program, as well as anything I try to write, fails with the assert in appcore.cpp: CWinApp::CWinApp(LPCTSTR lpszAppName){ . . . // initialize CWinThread state AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE(); AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread; ASSERT(AfxGetThread() == NULL); //<- FAILS HERE After some digging, I've found that I'm creating two CWinApps in my app (I think). I come thru CWinApp::CWinApp three times, failing on the third pass: Call stack for first pass: > mfc70d.dll!CWinApp::CWinApp(const char * lpszAppName=0x00000000) Line 226 C++ mfc70d.dll!$E2() Line 582 + 0xf C++ msvcr70d.dll!_initterm(void (void)* * pfbegin=0x7c2e6180, void (void)* * pfend=0x7c2e6184) Line 588 C mfc70d.dll!_CRT_INIT(void * hDllHandle=0x7c140000, unsigned long dwReason=1, void * lpreserved=0x0012fd30) Line 185 + 0xf C mfc70d.dll!_DllMainCRTStartup(void * hDllHandle=0x7c140000, unsigned long dwReason=1, void * lpreserved=0x0012fd30) Line 266 + 0x11 C Call stack for second pass: mfc70d.dll!CWinApp::CWinApp(const char * lpszAppName=0x00000000) Line 226 C++ > vgui_test2.exe!Cvgui_test2App::Cvgui_test2App() Line 31 + 0x2d C++ vgui_test2.exe!$E1() Line 39 + 0x28 C++ msvcr70d.dll!_initterm(void (void)* * pfbegin=0x004834a4, void (void)* * pfend=0x004835e4) Line 588 C vgui_test2.exe!WinMainCRTStartup() Line 336 + 0xf C Call stack for third pass: > mfc70d.dll!CWinApp::CWinApp(const char * lpszAppName=0x00000000) Line 226 C++ vgui_test2.exe!vgui_mfc_app::vgui_mfc_app() Line 30 + 0x11 C++ vgui_test2.exe!vgui_mfc_app_init::vgui_mfc_app_init() Line 15 + 0x22 C++ vgui_test2.exe!$E1() Line 95 + 0xd C++ msvcr70d.dll!_initterm(void (void)* * pfbegin=0x004834b4, void (void)* * pfend=0x004835e4) Line 588 C vgui_test2.exe!WinMainCRTStartup() Line 336 + 0xf C In vgui_register_all.cxx, the following is what makes that third call: #ifdef VGUI_USE_MFC # include <vgui/impl/mfc/vgui_mfc_app_init.h> vgui_mfc_app_init theAppinit; #endif As long as I don't declare any variables from vgui (like vgui_tableau_sptr etc.) the third call is never made (but nothing much else is gonna happen either!) As soon as I declare something like vgui_tableau_sptr tableau; it bombs. What's going on? Thanks in advance for your help. Steve |
From: Amitha P. <pe...@cs...> - 2003-11-25 19:45:54
|
Steve, I don't know too much about the MFC stuff, but I believe you can only have one instance of a CWinApp derived object in the executable. As you found, there is one in vgui. That one launches the appropriate initializations required for MFC. If you are using vgui for a simple display of results or some such, you shouldn't need any other. You should then create your project as a Windows console application, and rely only on the vgui calls for all your UI needs. If you created a MFC project (from the wizard, perhaps), then that probably you have a second instance that is creating trouble. If you need to build a MFC app, then try simply commenting out the global variable in vgui_register_all.cxx. I'll add the MFC example to my to-do list. Amitha. |