把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里了。

原创粉丝点击