把WinMain封装到dll里

例子如下:

1.dll项目文件testDll.cpp,代码:

#include "stdafx.h"
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) 

 MessageBox(0, L"恭喜您,成功调用DLL中的WinMain入口点", L"提示",0); 
 return 0;
}

2.在dll项目中添加def模块定义文件testDll.def,代码:
EXPORTS
WinMain

编译生成testDll.lib和testDll.dll两个库文件

3.主项目Test.cpp,代码:
#include "stdafx.h"
#pragma comment(lib, "../Debug/testDll.lib")  引入之前生成的静态库

编译生成Test.exe

这样运行Test.exe就会弹出dll中的提示框了。

------------------------------
原理:
 Test.cpp没入口点WinMain函数,只是连接了testDll库,当Test运行时,加载testDll的导出函数WinMain,Test发现自己的代码里没有入口点函数WinMain,而在testDll里找到了WinMain,就调用了testDllDll的WinMain。

----------------------------------
把WinMain封装到Dll里需要注意的几个地方:

1.经过实验发现,dll中入口点函数一定要为WinMain方式,而不能为wWinMain,因为主程序Test项目发现自己没入口点函数后就只寻找

WinMain入口点,而不会根据它自己是否定义了UNICODE来寻找WinMain还是wWinMain入口点。当然,如果入口点函数放在主程序Test项目源文件里,它则会根据是否定义了UNICODE来选择WinMain和wWinMain。但现在的情况就是,如果入口点函数不放在主程序Test项目源文件里(比如放在testDll中),则主程序只找WinMain入口点,而不找wWinMain。为什么会这样,具体情况未知,微软留的黑手。

2.testDll中导出WinMain入口点函数只能用def模块定义文件testDll.def方式导出,而不能用extern "C" __declspec(dllexport) int

WINAPI……方式导出。这两种导出是有区别的,def方式可以导出任何函数,而extern "C" __declspec(dllexport)不能导出WinMain和

wWinMain函数(连接时会提示这两个函数重定义了,也许还有些其他内定的函数也不能导出),为什么会这样,具体情况未知,微软留的黑

手。

--------------------

mfc封装原理:

mfc封装windows程序框架和上面的原理是差不多的,WinMain也是封装在dll里,只不过在WinMain函数前先实例了个全局对象CWinApp theApp,这个CWinApp类封装了Windows程序的框架,比如CWinApp定义了成员方法:初始化、注册窗口、创建窗口、消息处理函数等。C++实例完全局对象theApp后,就进入WinMain入口点函数,WinMain在调用theApp的方法:初始化、注册窗口、创建窗口等。

这样你主程序只要引用mfc库,不写WinMain入口点函数,就可以正常运行,因为WinMain函数已经在mfc的dll里了。

把WinMain封装到dll里相关推荐

  1. 【转】将QT开发的界面程序封装成DLL,在VC中成功调用

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  2. Matlab函数封装为DLL供Cpp调用

    Matlab函数封装为DLL供Cpp调用 文章目录 Matlab函数封装为DLL供Cpp调用 Ⅰ目标 Ⅱ 学习 Ⅲ 实现 1. Matlab 函数封装为DLL 2. vs2015中C++调用Matla ...

  3. 将MFC Grid Control封装为DLL的做法及其在DLL中的使用方法

    将MFC Grid Control封装为DLL的做法及其在DLL中的使用方法 MFCGrid control是一款非常优秀的网格控件,支持非常丰富的界面元素,如下图: 因而在数据库程序及报表程序应用较 ...

  4. wasm转c调用与封装至dll案例

    wasm转c调用与封装至dll案例 准备工作 初级 猿人学练习题 中级 崔大网习题 高级 某视频网站 准备工作 相关文档: 1.某德地图矢量瓦片逆向(快速wasm逆向),执行wasm2c翻译出来的c代 ...

  5. VisionPro——在脚本中调用自己封装的DLL

    VisionPro--在脚本中调用自己封装的DLL 前言 一.具体配置与代码 前言 做硬件测试时,用到了vp的c#脚本,由于偷懒导出数据表想直接用以前封装好的函数库,在测试时遇到些问题,在此做些记录. ...

  6. 【C++】QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例)

    QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例) 1.说明: 跨平台调用dll出现各种坑,谨以此文避坑. 参考博文:https://www.cnblogs.com/seer/p/4789 ...

  7. 把你的unity 工程中的cs文件封装成 dll

    文章目录 1.打开Visual Studio 新建一个类库(.NET Framework) 项目 2.unity的dll引用:UnityEngine.dll 和 UnityEditor.dll 3.. ...

  8. spdlog 封装为 DLL

    项目中需要快速写入巨量日志,一开始用的是boost::log,但遇到崩溃问题,程序负载大了,滚动日志时偶尔会崩溃,总是报: boost::filesystem_error,bad_year, bad_ ...

  9. python怎么封装方法然后调用_我现在想把自己写的python模块源代码封装成dll,然后在别的python脚本里调用,可以吗?...

    展开全部 可以的,只要把python模块转换成2113dll模块,利用5261Python自带的ctypes模块加载调用就行.4102 ctypes 是Python的外部函数库.它提供了与1653 C ...

最新文章

  1. 轨迹规划——自行车运动学模型
  2. Android--ImageButton的焦点及事件处理
  3. android模拟全局按键,android命令行模拟输入事件(文字、按键、触摸等)
  4. windows下解决mysql5中文乱码的问题
  5. 实现MySQL高可用群集配置_配置高可用性的MySQL服务器负载均衡群集
  6. “模块计算机类型“x64”与目标计算机类型“X86”冲突解决方案
  7. 4个空格和一个tab有什么区别_火花塞为什么一换就是4个?只换一个不行吗?
  8. c#字符型转化为asc_C#字符串和ASCII码的转换
  9. python sanic部署_Sanic教程:配置
  10. 《零基础》MySQL 排序(十八)
  11. python public_python中private、protectedamp;public
  12. 正则表达式常用匹配方式
  13. 2017年江苏省高等数学竞赛试题解答手稿
  14. php,表单+文本域,增加表单的文本域的html
  15. 2016计算机课程设计,2016年ps课程设计心得体会范文
  16. 揭开中本聪的真实身份?这只是杀毒软件之父疯狂人生中的一件小事
  17. Twitter实时搜索系统EarlyBird的总结
  18. mysql手机号以135开头_135开头的手机号码是移动还是联通
  19. 基于目的转发和通用转发区别
  20. 足球机器人守门员 类似梅西足球守门员机器人

热门文章

  1. 医院系统进不去 但是服务器能启动,您的计算机配置好像是正确的,但该设备或医院dns服务器没检测到有响应...
  2. 计算机专业好还是机械类专业好,机械类专业包括哪些专业
  3. linux的wine使用方法,Wine模拟器使用手册(转)
  4. PhotoShop 入门操作
  5. 用计算机牙模,计算机三维模型模拟牙齿及托槽移动
  6. 十四、公交站间的距离
  7. casili计算机按音乐,CASILI计算器怎么按反对数
  8. 每天读一遍,坚持27天,你的英语水平就可以达到跟美国人交流
  9. 如何入门黑客?黑客入门书籍推荐?
  10. python连接ssh执行模块_Python3学习之路~9.1 paramiko模块:实现ssh执行命令以及传输文件...