加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

当通过LoadLibrary调用DLL时,MFC状态无效

发布时间:2020-12-14 05:35:43 所属栏目:Windows 来源:网络整理
导读:我正在与MFC战斗并动态地将DLL与LoadLibrary链接.当app调用DLL时,我似乎无法获得MFC状态,并且DLL在同一个调用中回调.最终,它导致了大量的断言. 这是我正在做的代码模型. 该应用程序是正常的,直接来自向导MFC应用程序.我在某个地方有按钮,这是按钮的处理程序
我正在与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,但是当某些插件调用回调函数时,您确保设置应用程序的状态,以便它可以找到良好的对话框资源并执行特定于状态的函数

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读