7z lzma920源码封装 C++ DLL,可直接调用压缩

7z lzma920源码封装 C++ DLL,可直接调用压缩

 

该My7zdll,由7z lzma920源码封装而来,dll项目及测试项目路径在:F:\my7z\sourcechangemy7z\lzma920\CPP\7zip\UI\My7zDLL和My7zDLLTest两个项目。使用该DLL程序时,需要附带原版7z.dll (可在7z安装包中找到)、My7zDLL.dll 、MyTest7zDLL.exe。如需要修改即可修改My7zDLL项目中的文件即可。

 

项目思路:

         源码下CPP\7zip\UI\Clinet7z项目则是7z项目测试小程序,因此我将在该解决方案下,创建新DLL项目,进一步封装得到。

 

所遇问题:

1.源码编译出错。 LINK:fatalerror LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

解决方案:

第一步:将 项目——项目属性——配置属性——连接器——清单文件——嵌入清单 “是”改为“否”。若还不能解决问题进入第二步。

第二步:查看计算机是否为64bit操作系统,如是,继续如下操作。

查找是否有两个cvtres.exe。

C:\Program Files(x86)\Microsoft VisualStudio 10.0\vc\bin\cvtres.exe

C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe

右键属性—详细信息,查看两者版本号,删除/重命名较旧的版本,或者重新设置Path变量。治本的办法是第二步,删除旧版本的cvtres.exe后,就不需要每次都设置配置了。

 

2.添加DLL工程,编译问题。

         考虑到项目文件包含关系,我直接在Clinet7z项目解决方案下,新建DLL项目,然后将,Client7z项目下相关文件全部加载到该DLL项目中,然后,编译出现错误。

2.1很多文件包含错误,从#include“XXXXX”文件包含上看,有些包含路径不对,但是我考虑到Clinet7z文件编译通过,且可运行,所以,估计是项目属性配置不一致,于是,在项目->属性-> C/C++ -> 附加包含目录中将Client7z项目中复制过来,找不到文件的问题解决。

2.2 项目中用到了多字节字符集,所以,将项目属性-> 常规-> 字符集修改为使用多字节字符集。

2.3 errorLNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在NewHandler.obj 中定义,网上找相关资料: 项目属性——配置——常规——MFC的使用:在共享 DLL 中使用 MFC,即可解决问题。http://www.vcerror.com/?p=1924

补充说明一下:后来我将生成的DLL及测试工具放到没有MFC环境的机器上运行,加载DLL事出现加载失败。原因是我该处使用了共享DLL的方式,应该是静态库的方式使用。但是当我将配置改为静态库使用MFC时,及又出现了该问题。我找了很多资料,大多都是说MFC库和CRT库加载顺序的问题,但是我按照方法添加配置,并没有解决问题,于是我直接注释掉7z源码中的NewHandler.h 和NewHandler.cpp中的对new和delete的重载,然后编译通过,且可在没有MFC环境的机器上运行。希望有大神指点如何配置环境解决这个问题!以求共同学习!

2.4 项目DLL输出路径。项目属性->配置属性->常规-> 输出目录 修改为.\Debug\;中间目录 修改为.\Debug\ 。注:如果不修改,看项目编译日志可看出生成到了Clinet7zDebug中了,因为我是在Clinet7z的解决方案中添加的项目。

 

3.修改项目文件。将Client7z项目中的Clinet7z.cpp文件内容复制到DLL中新建的my7z.cpp中,将main中内容封装入函数中,然后将main体注释。

 

4.将封装后的函数,导出即可。

 

5.编写测试DLL小程序,即本项目中的My7zDLLTest功能

 

源码链接:

http://download.csdn.net/detail/yaoshenjie/9870432

https://download.csdn.net/download/yaoshenjie/9732959

 

你可能感兴趣的:(c++,Windows)