我正在与 MFC 进行斗争,并使用 LoadLibrary 动态链接 DLL。当应用程序调用DLL并且DLL在同一调用中回调时,我似乎无法正确获取MFC状态。最终,它导致了大量的断言。
这是我正在做的事情的代码模型。
-
该应用程序很正常,直接来自向导 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 项目设置为启动项目):系统插件.zip http://dl.dropbox.com/u/21305264/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,但是当某些插件调用回调函数时,您请确保设置应用程序的状态,以便它可以找到良好的对话框资源并执行特定于状态的函数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)