把WinMain封装到dll里
把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里相关推荐
- 【转】将QT开发的界面程序封装成DLL,在VC中成功调用
最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...
- Matlab函数封装为DLL供Cpp调用
Matlab函数封装为DLL供Cpp调用 文章目录 Matlab函数封装为DLL供Cpp调用 Ⅰ目标 Ⅱ 学习 Ⅲ 实现 1. Matlab 函数封装为DLL 2. vs2015中C++调用Matla ...
- 将MFC Grid Control封装为DLL的做法及其在DLL中的使用方法
将MFC Grid Control封装为DLL的做法及其在DLL中的使用方法 MFCGrid control是一款非常优秀的网格控件,支持非常丰富的界面元素,如下图: 因而在数据库程序及报表程序应用较 ...
- wasm转c调用与封装至dll案例
wasm转c调用与封装至dll案例 准备工作 初级 猿人学练习题 中级 崔大网习题 高级 某视频网站 准备工作 相关文档: 1.某德地图矢量瓦片逆向(快速wasm逆向),执行wasm2c翻译出来的c代 ...
- VisionPro——在脚本中调用自己封装的DLL
VisionPro--在脚本中调用自己封装的DLL 前言 一.具体配置与代码 前言 做硬件测试时,用到了vp的c#脚本,由于偷懒导出数据表想直接用以前封装好的函数库,在测试时遇到些问题,在此做些记录. ...
- 【C++】QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例)
QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例) 1.说明: 跨平台调用dll出现各种坑,谨以此文避坑. 参考博文:https://www.cnblogs.com/seer/p/4789 ...
- 把你的unity 工程中的cs文件封装成 dll
文章目录 1.打开Visual Studio 新建一个类库(.NET Framework) 项目 2.unity的dll引用:UnityEngine.dll 和 UnityEditor.dll 3.. ...
- spdlog 封装为 DLL
项目中需要快速写入巨量日志,一开始用的是boost::log,但遇到崩溃问题,程序负载大了,滚动日志时偶尔会崩溃,总是报: boost::filesystem_error,bad_year, bad_ ...
- python怎么封装方法然后调用_我现在想把自己写的python模块源代码封装成dll,然后在别的python脚本里调用,可以吗?...
展开全部 可以的,只要把python模块转换成2113dll模块,利用5261Python自带的ctypes模块加载调用就行.4102 ctypes 是Python的外部函数库.它提供了与1653 C ...
最新文章
- .data和.text段合并
- 定点数的编码表示方法
- micropython 蓝牙音箱_你愿意用ESPY-core做哪些有趣尝试?
- python api加快交易速度_使用Python3的pipedriveapi将交易输出限制为1000个交易
- 一览众山小的上一句是什么,怎么理解一览众山小的意思?
- Xcode升级后插件失效
- JQuery合并table单元格--有限制(table格式需要注意)
- kafka linux根目录满,Linux磁盘空间满的诡异问题解决方案
- 华三 h3c super vlan配置
- adadelta算法_机器学习中的优化算法(3)-AdaGrad, Adadelta(附Python示例)
- LaTex的图文安装--TexLife+SumtraPDF+Vscode
- 张学孟 (帮别人名字作诗)
- NLP - sentencepiece
- OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点(图文并茂+浅显易懂+程序源码)
- 10个学习Java的网站,肯定有你不知道的哦!
- Java基础重温_06:Debug模式(打断点、下一步),基础练习案例(减肥计划if,switch版本、逢七跳过、不死神兔、百钱白鸡、数组元素(求和,索引位置,反转)、判断数组是否相同、评委打分)
- [Apple Shapr3D]【续更】【shapr3D】认识Shapr3D,一个简单易用的设计类软件
- 重定向和请求转发的区别
- 【文献翻译CVPR2022】SoftGroup for 3D Instance Segmentation on Point Clouds
- android最新系统排行,安卓系统最新排名公布!论流畅MIUI也只能排第六
热门文章
- flash计算机基础实验,计算机应用基础实验报告(flash).pdf
- 计算统一社会信用代码的校验码(Lua)
- 吉林师范计算机考研真题,吉林师范大学考研真题汇总—方才学习网
- 计算机的软盘有没有磁性材料,磁性材料竟然还有如此惊人的历史!
- Unable to instantiate Action,,,,,,,,,defined for ',,,' in namespace '/,,,'null
- 测试绝地求生显卡使用率软件,玩绝地求生需要什么显卡才能流畅运行?10系列显卡吃鸡游戏测试对比...
- 《中国棒球》:国家女子棒球队·一棒成名
- galerkin有限元法matlab实现,有限元法求解二维Poisson方程的MATLAB实现
- ABB机器人外部轴参数(KpKvTi)调试
- 十分钟教你掌握CPU缓存