我正在与MFC战斗并动态地将DLL与LoadLibrary链接.当app调用DLL时,我似乎无法获得MFC状态,并且DLL在同一个调用中回调.最终,它导致了大量的断言.
这是我正在做的代码模型.
>该应用程序是正常的,直接来自向导MFC应用程序.我在某个地方有按钮,这是按钮的处理程序:
void callback() { AFX_MANAGE_STATE(AfxGetStaticModuleState( )); CDialog1 dlg; dlg.DoModal(); } typedef void (*TPluginMainFunc)(void*); void CTheApp1View::OnTestRun1() { static HMODULE hPluginMFCShared = LoadLibrary( _T("PluginMFCShared") ); if ( hPluginMFCShared ) { TPluginMainFunc func = (TPluginMainFunc) GetProcAddress( hPluginMFCShared,"plugin_main" ); if ( func ) { func(callback); } } }
>然后’PluginMFCShared’看起来像这样:
typedef void (*TFunc)(); extern "C" void GS_EXTERNAL_ENTRY plugin_main(TFunc func) { AFX_MANAGE_STATE(AfxGetStaticModuleState( )); func(); CDialog1 dlg; dlg.DoModal(); }
因此,我们的想法是应用程序(CTheApp1View :: OnTestRun1)加载一个库并调用直接传入回调指针的函数.在继续之前,库将使用该回调从应用程序执行某些操作.
我以为AFX_MANAGE_STATE会处理MFC状态,但似乎还有更多工作需要完成.
可以找到一个测试项目(确保将TheApp1项目设置为启动项目):
SystemOfPlugins.zip
有任何想法吗?
谢谢你的任何建议.
解决方法
这是另一个建议.在App变量中,添加名为m_pModuleState的AFX_MODULE_STATE *变量,并在InitInstance函数末尾初始化它,
m_pModuleState = AfxGetModuleState();
修改回调函数以在打开对话框之前设置应用程序状态,然后在退出函数之前设置回原始状态
void callback() { //Get the original state AFX_MODULE_STATE* pOriginalState = AfxGetModuleState(); //Set the mfc state AfxSetModuleState(((CTheApp1App*)&theApp)->m_pModuleState); //Do stuff here CDialog1 dlg; dlg.DoModal(); //Set the mfc state back to its original state AfxSetModuleState(pOriginalState); }
并保持你的插件在你的例子中
extern "C" void GS_EXTERNAL_ENTRY plugin_main(TFunc func) { AFX_MANAGE_STATE(AfxGetStaticModuleState( )); func(); CDialog1 dlg; dlg.DoModal(); }
这样,您可以在插件中调用AFX_MANAGE_STATE,但是当某些插件调用回调函数时,您确保设置应用程序的状态,以便它可以找到良好的对话框资源并执行特定于状态的函数