【发布时间】:2012-01-20 06:48:46
【问题描述】:
我正在使用 MFC 并动态链接 DLL 与 LoadLibrary。当应用程序调用 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
有什么想法吗?
感谢您的任何建议。
【问题讨论】:
-
CDialog1 是在 DLL、应用程序还是两者中定义?您似乎在这两个地方都使用它,这将是一个问题。
DoModal需要处于定义它的任何位置的状态。 -
是的,CDialog1是在app和DLL中分别定义的,是完全不同的对话框资源。这两个项目(应用程序和 DLL)没有任何共同之处。代码 sn -p 只是为了演示案例。
标签: dll mfc shared-libraries