(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
参考文档: http://blog.sina.com.cn/s/blog_5f432e6a0100uaet.html
编写MFC程序的时候,使用dependency查看依赖时,会看到有依赖MFC的库,通常都包含如下这两个:
MSCVCR100/90/80/70.dll库是一个很独立的库,它只依赖库Kenel32/kenel64
MFC100/90/80/70.dll也相对独立,依赖MSCVCR库和一些其它windows系统库,依赖相对较多一点,但在windows下一般都是有的。
但编写MFC程序时,我们希望程序能在别人的电脑上运行,就需要额外把这些库也安装到别人的机器上去了,通常有几种方法
a. 你可以发布程序的时候带上这两个依赖库一块发布。
b. 使用installshield类似工具做一个安装包
c. 把dll作为资源放到程序中,运行时释放出来,
c.1 例如使用工具(单文件制作封装工具(Enigma Virtual Box)V7.20 中文版)
c.2 自己代码实现dll释放
本次重点介绍c.2(实现dll打包到程序中并在执行时释放)的实现方法,
首先,把这个库作为资源放到工程中,例如 "DllResourc" "xxx.dll"
然后,在程序一开始的地方,把这个dll释放出来,释放方法 FindResource, LoadResource, LockResource, ResourceSize,创建文件,写文件。
样例代码如下:
Do { // 参考: http://blog.sina.com.cn/s/blog_5f432e6a0100uaet.html // begin export file // 查找资源 HRSRC hRsrc =::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_DLLRESOURCE_VC100x86), _T("DllRESOURCE")); DWORD dwError = GetLastError(); if(hRsrc ==NULL) break; // 加载资源 HGLOBAL hImgData =::LoadResource(AfxGetResourceHandle(), hRsrc); if(hImgData ==NULL) { ::FreeResource(hImgData); break; } // 锁定内存中的指定资源 LPVOID lpVoid =::LockResource(hImgData); DWORD dwSize =::SizeofResource(AfxGetResourceHandle(), hRsrc); // 把资源数据写出到文件 CFile file; file.Open(_T("C:\\abc.dll"), CFile::modeCreate|CFile::modeWrite); file.Write(lpVoid, dwSize); file.Close(); // 释放资源 ::FreeResource(hImgData); // end export file }while(false); |
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)