把WinMain封装到dll里
2010-12-14 21:36
197 查看
把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里了。
例子如下:
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里
- asp封装dll
- 在vs.net2005中将webservice封装成独立的dll
- unity脚本封装成dll
- DLL封装框架视图经验总结二
- C#调用C++Dll封装时遇到的一系列问题
- 如何封装C++类,输出dll
- 将一个类封装到dll和linux的so
- C++封装ADO数据库连接,并附上DLL源码和测试程序
- 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
- VB封装DLL实例(一)
- 将MFC Grid control封装为DLL的做法及其在DLL中的使用方法
- [z]DLL封装框架视图经验总结二
- C++ win32工程如何封装成DLL。
- ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)
- 用宏定义封装LoadLibrary,方便的动态加载dll
- [整理]c#简单调用DELPHI DLL封装窗体
- ASP.NET 程序设计中常用到的一些通用函数 自己的封装 可以做成dll来使用。
- VB封装DLL文件讲解---2
- [Unity3d]调用自己封装的dll,假装让自己也牛B一把吧