当前位置: 首页 > news >正文

DLL 支持MFC 没有DLLMAIN函数

如果使用VC编写DLL时,需要MFC功能; 一般在源文件里就不能手动写DLLMAIN函数了

它给MFC集成了,\src\mfc\dllmodule.cpp
打开它,里面有有一个DLLMAIN函数,根据源码意思就可以看出来,

这里截取的一点点代码
if (dwReason == DLL_PROCESS_ATTACH)
    {
        BOOL bResult = FALSE;

#ifdef _AFXDLL
        // wire up resources from core DLL
        AfxCoreInitModule();
#endif

        _AFX_THREAD_STATE* pState = AfxGetThreadState();
        AFX_MODULE_STATE* pPrevModState = pState->m_pPrevModuleState;

        // Initialize DLL's instance(/module) not the app's
        if (!AfxWinInit(hInstance, NULL, _T(""), 0))
        {
            AfxWinTerm();
            goto Cleanup;       // Init Failed
        }

        // initialize the single instance DLL
        CWinApp* pApp; pApp = AfxGetApp();关键在这里了
        if (pApp != NULL && !pApp->InitInstance())///这里会调用 初始化函数
        {
            pApp->ExitInstance();///这也是退出时函数
            AfxWinTerm();
            goto Cleanup;       // Init Failed
        }

        pState->m_pPrevModuleState = pPrevModState;
#ifdef _AFXDLL
        // wire up this DLL into the resource chain
        VERIFY(AfxInitExtensionModule(controlDLL, hInstance));
        TRY
        {
            CDynLinkLibrary* pDLL; 
            pDLL = new CDynLinkLibrary(controlDLL);
        }
        CATCH(CMemoryException, e)
        {
            DELETE_EXCEPTION(e);
            pApp->ExitInstance();
            AfxWinTerm();
            goto Cleanup;       // Init Failed
        }
        END_CATCH



DLL_PROCESS_ATTACH

DLL_PROCESS_DETACH

这是莪们关心的,从上面代码中可以看到,这里面MFC调用一个全局的CWinApp类的 初始化函数


也就是说,现在写一个类,让它继承CWinApp

然后重载它的InitInstace 和ExitInstace就可以了

在InitInstace时里面写入所需要的代码就可以了

然后在声明一个全局的变量,一定要是个全局变量

当然这个类可以不用做任何事情,就提供初始化和退出时处理的函数



如果在DLL 动态库中导出全局变量
extern int __decspec


如果EXE中要使用DLL中的资源,因为DLL和EXE的资源ID很有可能会冲突,在函数第一行加入如下代码可解决此问题

AFX_MANAGE_STATE(AfxGetStaticModuleState());

AFX_MANAGE_STATE是一个宏,其原型为: 

AFX_MANAGE_STATE( AFX_MODULE_STATE* pModuleState )


该宏用于将pModuleState设置为当前的有效模块状态。当离开该宏的作用域时(也就离开了pModuleState所指向栈上对象的作用域),先前的模块状态将由AFX_MODULE_STATE的析构函数恢复。

方法二 在DLL接口函数中使用:

AfxGetResourceHandle();

AfxSetResourceHandle(HINSTANCE xxx);


AfxGetResourceHandle用于获取当前资源模块句柄,而AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄。

我们将DLL中的接口函数ShowDlg改为:
void ShowDlg(void)

{ 

//方法2的状态变更

HINSTANCE save_hInstance = AfxGetResourceHandle(); 

AfxSetResourceHandle(theApp.m_hInstance); 



CDialog dlg(IDD_DLL_DIALOG);//打开ID为2000的对话框

dlg.DoModal();

//方法2的状态还原

AfxSetResourceHandle(save_hInstance);

相关文章:

  • Dojo学习笔记(4. dojo.string dojo.lang)
  • 人类的心理行为模式,---》阮一峰,
  • 瞧这一天
  • iOS 消息推送原理及实现Demo
  • 我的第一张博客
  • JSP一句话后门--2006-08-03
  • Linux实用命令工具-dtrx根据需要自动解压
  • SQL Server 2005-如何在SQL Server用户自订函数中调用GetDate()函数
  • Linux下C程序的编辑,编译和运行以及调试
  • SharePoint Server 2007 Web内容管理中的几个关键概念
  • 带外监控
  • 自动内容滚动条[WinForm控件]
  • C# 生成二维码
  • CSS在ASP.NET中使用
  • 字符填充的首尾定界符法
  • ----------
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【node学习】协程
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Centos6.8 使用rpm安装mysql5.7
  • ECMAScript入门(七)--Module语法
  • Github访问慢解决办法
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • mysql中InnoDB引擎中页的概念
  • Spring核心 Bean的高级装配
  • 聊聊directory traversal attack
  • 事件委托的小应用
  • 我感觉这是史上最牛的防sql注入方法类
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • ###STL(标准模板库)
  • #数学建模# 线性规划问题的Matlab求解
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (三)elasticsearch 源码之启动流程分析
  • ***测试-HTTP方法
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .bat批处理(一):@echo off
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .Net接口调试与案例
  • .net经典笔试题
  • .NET企业级应用架构设计系列之开场白
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [20140403]查询是否产生日志
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [Android]使用Git将项目提交到GitHub
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C++]——带你学习类和对象
  • [GXYCTF2019]禁止套娃
  • [HNOI2008]Cards