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

2024-01-12

我正在与 MFC 进行斗争,并使用 LoadLibrary 动态链接 DLL。当应用程序调用DLL并且DLL在同一调用中回调时,我似乎无法正确获取MFC状态。最终,它导致了大量的断言。

这是我正在做的事情的代码模型。

  1. 该应用程序很正常,直接来自向导 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);
                    }
            }
    }
    
  2. 然后“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(使用前将#替换为@)

通过 LoadLibrary 调用 DLL 时 MFC 状态无效 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • CComboBox DDX_CBString 行为令人困惑

    我在对话框中使用 ComboBox 控件为用户提供一些有用的值 例如 10 20 100 400 800 但让用户根据需要插入准确的值 经过很长时间我发现 如果我输入值40在 Combobox 中 Combobox 始终在 UpdataDa
  • 如何中止使用 wininet 发送的请求?

    我有一个 MFC 应用程序 用于向相应的服务器发送 post 请求 这是一个http请求 用于上传文件 但有要求中止发送的请求 就像用户正在发送一个大文件一样 用户应该能够在请求完成之前取消请求 我正在使用 wininet api Http
  • 如何让MCR启动时间快

    我将 matlab 程序转换为 net 程序集 即 dll 文件 我制作了一个控制台 C 应用程序 添加了 dll 文件并从 php 调用它 每次调用 exe 时都会调用 MCR 如何使 MCR 在服务器启动时初始化 并且即使在一段时间后调
  • dll:静态链接与隐式链接,一样吗?

    关于Dll链接 静态链接和隐式链接是一回事吗 我理解隐式链接和显式链接之间的区别 并且我认为静态与隐式链接同义 但我不确定 如果它们确实不同 它们之间有什么区别 以及我如何指定我想要哪一个 this link http msdn micro
  • 如何获取通过网络驱动器访问的文件的 UNC 路径?

    我正在 VC 中开发一个应用程序 其中网络驱动器用于访问文件 驱动器由用户手动分配 然后在应用程序中选择驱动器 这会导致驱动器并不总是映射到相同的服务器 我该如何获取此类文件的 UNC 路径 这主要是为了识别目的 这是我用来将普通路径转换为
  • 使用 C++ 程序中的 dll。 (borland c++ builder 和一般情况)

    我试图在我的程序中使用一个 dll 即 libcurl 但是它没有链接 Libcurl 附带了我可以包含的 h 文件 负责 dllimport 但我想我必须指定在以某种方式链接时实际使用哪个 dll 我该怎么做 我正在使用 Borland
  • 我想在 VB6 程序中使用 VB.NET dll。是否可以?

    我在 VB6 程序中使用 VB NET dll 时遇到问题 我已经使用 GuidAttribute 创建了 dll 使用 RegAsm 创建了 tlb 并将其添加到我的 VB6 程序的引用中 问题是当我尝试使用 CreateObject 函
  • DLL 需要访问其应用程序的符号

    在 C 中 DLL 是否可以访问加载它的应用程序的某些符号 我有一个加载插件 dll 的应用程序 这些插件需要访问该应用程序的某些API 是否可以在不创建共享此 API 的新 DLL 的情况下实现此目的 函数指针结构适合这种情况吗 示例 主
  • MSBuild 命令行 - 添加 dll 引用

    我使用 makefile 来编译我的 C 项目 在这个makefile中 我创建了一个库tools dll 调用csc exe OK 现在 我想在我的项目中使用这个 dll 由于某些原因 我必须使用使用 csproj 文件的 MSBuild
  • 如何在Electron App中调用C# dll方法?

    我有一个电子应用程序 可以从读卡器读取信用卡详细信息 他们提供了一个 c dll 来与应用程序交互 我不知道如何从电子应用程序读取 dll 方法 首先使用以下命令检查 dll 中公开的函数依赖步行者 http www dependencyw
  • 为什么“[DllImport]”会因“RtlSecureZeroMemory”入口点而失败,即使它是一个有据可查的入口点?

    尝试使用kernel32函数SecureZeroMemory 使用下面的代码失败了 System EntryPointNotFoundException 尽管有详细记录在这里 在 PInvoke 上 https www pinvoke ne
  • 在 Visual Studio 中引用同一解决方案中的项目

    我有一个包含两个项目的解决方案 其中一个项目是一个带有 DLL 文件的库 我希望能够在其他项目中引用该项目库以使用其类 我的最终目标是做到这一点 同时仍然可以访问库源代码 我尝试过引用 dll 也尝试过引用 csproj 这两种情况都有效
  • 将 Scala 文件转换为 Dll

    我有一些使用 IntelliJ 和 SBT Plugin 编写的 scala 代码 并希望将代码作为 C 的 DLL 提供给我 我已经尝试使用 ikvmc 我通过 package 将所有类打包在一个罐子中 之后 我手动设置一个 jar 其中
  • 链接器如何在没有 SONAME 的情况下找到共享库

    如果我创建一个没有这样的 SONAME 的共享库 gcc shared libfoo o o libfoo so 并链接到它 链接器如何找到我的共享库 是文件名libfoo so链接器将其视为默认 SONAME 吗 我想你是正确的 ld 手
  • Oracle DataAccess 相关:“动态程序集中不支持调用的成员。”

    据我了解 此类错误已在 SO 上讨论过多次 有些人认为这是 DLL 文件中的错误 有些人通过更改 DLL 版本来解决 其他人似乎没有任何线索 无论如何 我只是发帖试试运气 在 C GUI 上的网格中选择一行时 我的应用程序崩溃了 stack
  • 如何将CString转换为整数和浮点数? [复制]

    这个问题在这里已经有答案了 我正在尝试转换CStringint 和 float 但无法找到任何 C 库函数来完成此操作 请帮忙 正确的UNICODE 符合规定的方式MFC如下 CString sInt T 10 int n ttoi sIn
  • MFC:从另一个线程调用 CWnd 方法安全吗?

    其实我有两个问题 打电话安全吗SendMessage来自工作线程 Do CWnd方法 比如MessageBox 调用API函数SendMessage幕后 根据我的理解 当工作线程调用时SendMessage 它将消息推送到UI线程的消息队列
  • 调试器忽略动态加载的 DLL 中的错误

    我有一个与自编码 DLL 的调试相关的非常奇怪的问题 我有一个 MFC 驱动的基于对话框的应用程序 几个静态链接的项目和几个在运行时加载的 DLL 项目 我在调试中构建解决方案 运行应用程序 然后我可以轻松调试这些 DLL 项目 现在问题来
  • 支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 以及 OPOS 可以工作吗?

    我试图了解将在 x86 Windows 10 上运行的 C MFC 应用程序移植到具有 Qualcomm Snapdragon 处理器的 ARM Windows 10 设备的障碍 32位应用程序具有以下特点 MFC 与 C 用于用户界面 C

随机推荐

  • T4 输出到字符串

    我是 T4 的新手 我想生成 CRUD 存储过程 数据访问层 输出到字符串 我正在尝试创建一种对其他程序员也有用的 Web 服务 api 只需输入数据 然后下载 zip 文件 我已经搜索了很多 但找不到一种生成字符串输出的方法 是否可能 任
  • 在 C++ 中禁用复制省略

    免责声明 研究的目标是如何禁用所提供代码部分的复制省略和返回值优化 如果想提及诸如 XY 问题之类的问题 请避免回答 该问题具有严格的技术和研究性质 并且以这种方式明确提出 C 14 中引入了复制省略和返回值优化 如果某个对象已在一个表达式
  • 跨多个文件的 Javascript 中的全局变量

    我的一堆 JavaScript 代码位于名为 helpers js 的外部文件中 在调用此 JavaScript 代码的 HTML 中 我发现自己需要知道是否调用了 helpers js 中的某个函数 我试图通过定义创建一个全局变量 var
  • Log4J:警告无法为 Logger 错误找到 Appender

    下面是我的log4j properties文件内容 文件与eclipse中的src文件夹放在一起 Application Logs log4j rootlogger INFO logg log4j appender logg org apa
  • Facebook 应用程序是使用 PhoneGap 或 Appcelerator 等移动开发框架构建的吗?

    我发现了numerous http venturebeat com 2011 07 08 hybrid mobile apps take off as html5 vs native debate continues sources htt
  • node.js http.get 在对远程站点发出 5 次请求后挂起

    我正在编写一个简单的 api 端点来确定我的服务器是否能够访问互联网 它工作得很好 但是在 5 个请求之后 每次都是 5 个 请求就会挂起 当我将 Google 切换到 Hotmail com 时 也会发生同样的情况 这让我觉得这是我的事情
  • 从另一个应用程序启动时,应用程序将失去记住其堆栈的能力

    现在我已经对此进行了更多研究 我写这篇文章是为了让它更清楚 如果您正在寻找更多信息 可以在旧版本中找到一些信息 怎么了 这是指没有设置任何launchMode的应用程序 设置 因此使用默认值 您可以从市场或安装程序启动应用程序 这 启动应用
  • 将特定风格的依赖关系与维度链接起来

    我正在开发一个 Android 应用程序 它有两种类型 免费和付费 每层都有 2 个版本 轻型和重型 这是 Gradle 的实现 flavorDimensions tier distro productFlavors free dimens
  • Java 10:替换 java.xml.ws 冲突

    我必须使用java xml ws 我的项目中包含一些组件 但因为它已被弃用并且很快就会被删除 所以我想使用这些组件的替代品 所以我将此依赖项添加到我的项目中pom file
  • 如何从 Dart 的 List 中获取随机元素?

    如何从 Dart 集合中检索随机元素 var list a b c d e import dart math var list a b c d e generates a new Random object final random new
  • 为什么一个字节只有0到255?

    为什么一个字节的范围只有0到255 严格来说 术语 字节 实际上可以指具有 256 个值以外的单元 只不过是这样而已几乎普遍尺寸 从维基百科 http en wikipedia org wiki Byte 从历史上看 一个字节是 用于编码单
  • 错误 c4996 检查迭代器

    我使用 VC 2013 我有以下代码 pragma warning disable 4996 define D SCL SECURE NO WARNINGS include
  • LinqToSql 和 WCF

    在使用 WCF 服务与数据库交互的 n 层应用程序中 在整个应用程序中使用 LinqToSql 类的最佳实践方法是什么 我见过它以几种不同的方式完成 但它们似乎花费了大量时间来创建额外的接口 消息类等 这减少了您无需编写数据访问代码而获得的
  • 一次按多个键让我的角色沿对角线移动

    我遇到的问题是 当用户按下 K UP 键和 K RIGHT 键或 K UP 键和 K DOWN 键等时 我试图使我的角色在屏幕上对角移动 这是我的角色移动代码 事件处理 1 Event Handling 2 for event in pyg
  • 无法加载文件或程序集“ServiceStack”或其依赖项之一。该系统找不到指定的文件

    我试图将我的网络应用程序启动到服务器 Server Windows Server 2008 R2 企业版 IIS版本 7 5 框架版本 4 0 30319 17929 但出现以下错误 Server Error in salavirtual
  • 绑定转换器参数

    有没有办法我可以做到这一点Style
  • jQuery 克隆链接选择

    我刚刚开始 http jsfiddle net FJFFJ 1 http jsfiddle net FJFFJ 1 by 使用 JQuery 链接动态创建的下拉菜单 https stackoverflow com q 5545229 151
  • 如何开始使用 ARM 处理器?

    对于新手来说 是否建议直接从 ARM 处理器的数据表和用户手册开始 或者先了解 ARM 世界然后再继续 当我开始使用一项新的 对我来说 技术时 我首先会找到尽可能多的数据表和应用说明 然后直接阅读它们 第一个目标是快速了解该技术特有的术语
  • 打印 $_POST 变量名称和值

    我在 PHP 中有一个 POST 我并不总是知道要处理的变量字段的名称 我有一个函数可以循环遍历这些值 但是我也想捕获与之相关的变量名称 foreach POST as entry print entry br 一旦我弄清楚如何获取变量名称
  • 通过 LoadLibrary 调用 DLL 时 MFC 状态无效

    我正在与 MFC 进行斗争 并使用 LoadLibrary 动态链接 DLL 当应用程序调用DLL并且DLL在同一调用中回调时 我似乎无法正确获取MFC状态 最终 它导致了大量的断言 这是我正在做的事情的代码模型 该应用程序很正常 直接来自