把WinMain封装到dll里
来源:互联网 发布:sqlserver 表变量 编辑:程序博客网 时间:2024/05/02 02:36
把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里
- 把WinMain封装到dll里
- 把WinMain封装在lib里
- VC++中把窗体封装到dll中并调用
- VC++中把窗体封装到dll中并调用
- 定义一个JavaBean,把数据封装到bean里
- 怎么把引用的dll加入到解决方案里
- 数据库连接封装到DLL
- 封装DLL到EXE
- MFC wINMain的封装
- 将main、WinMain封装
- 如何把自己常用的类封装到DLL方便使用
- struts2中怎么把表单数据封装到实体类里
- WinMain里写入 ActiveRun()
- Delphi封装类到DLL
- 用VB把asp封装成dll
- 从main到WinMain
- mfc 封装 theapp winmain afxGetapp
- 负数在计算机中的保存
- 《Java与模式》学习笔记之四——适配器(Adapter)模式
- android 和linux的休眠唤醒机制
- 如何成为Java高手?
- SQL SERVER 2008的错误日志太大
- 把WinMain封装到dll里
- 教师图像跟踪系统
- 编译VC++类的动态链接库DLL 导出类及其中的函数
- 布线时的阻抗匹配问题
- 自动关闭空闲的sde连接
- Python Idioms and Efficiency
- Android进阶高手(五)之Android聊天室(4)---完结篇
- Collective Communication
- 隐藏部分相同数据