VC 怎么导出一个bcb写的DLL 的LIB文件

EagleFew 2008-06-03 05:10:11
我有一个bcb写的DLL ,我导出了它的lib 文件,然后在vc中使用静态链接的方式使用该DLL

编译都能通过,但是运行的时候就提示"The procedure entry point OpenComm@28 could not be located in the dynamic link library SERIALLIB.DLL"

请教一下这是怎么回事?

其中导出lib 用的def文件内容 :(OpenComm 导出函数是__stdcall 的)
LIBRARY SERIALLIB.DLL

EXPORTS
Bytes2String@12
CloseComm@8
DecodePackage@12
EncodePackage@12
GetSerialPort@4
OpenComm@28
ReadComm@8
SetComBufsize@12
SetParamAsyn@12
String2Bytes@12
WriteComm@16
asCheckSum@8
isRightData@12


...全文
205 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
vick 2008-06-05
  • 打赏
  • 举报
回复
动态调用是一种方法

另外一种就是定义BCB的DLL时必须要使用stdcall,用标准c风格
loveshell 2008-06-05
  • 打赏
  • 举报
回复
如果不是动态调用的话,说说是怎么解决的嘛
laowang2 2008-06-04
  • 打赏
  • 举报
回复
vc没有工具可以转换。
loveshell 2008-06-04
  • 打赏
  • 举报
回复
我也尝试过很久,还是动态调用方便。网上说的两种方法,我都没试成功,你可以试试
第一种:
1.使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
EXAMPLE:
DUMPBIN VideoDeCoder.dll /EXPORTS /OUT:VideoDeCoder.def
2.将导出的.DEF文件整理为一符合.DEF个数的函数导出文件(整理过程巨乱巨复杂,懒得举例了,后面有简便方法^_^)
3.使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
EXAMPLE:
LIB/DEF:VideoDeCoder.def /MACHINE:IX86
4.连接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
error LNK2002:unresolved external symbol "functionname@nn"
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立LIB,重新链接即可.
这样就制作成功了符合VC调用方式的LIB了!

要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,这种方法只能应用于输出为C格式的__stdcall调用方式,只要做一点点修改就可以成为符合VC的DEF文件!
IMPDEF xxx.def xxx.dll
只要将BCB的DEF文件中函数申明格式转换为vc识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!

第二种:
(1)用MSVC创建一个不使用MFC的DLL
(2)编辑你的DLL源代码,抛开每一个例程的函数体部分,使用一个假的返回值
(3) 配置MSVC工程生成的DLL,采用和BCB DLL同的的名字
(4)制作DEF文件添加到MSVC工程,目的是禁止它对__stdcall命名进行修饰
(5) 编译第4步得到的虚假DLL工程。这将会生成一个DLL(你可以把它丢到垃圾筒里)和一个LIB文件(这是你需要的)。
(6)把从第5步得到的LIB文件添加到你需要调用这个BCB DLL的MSVC工程里,并声明:
_declspec(dllimport) void __stdcall MyFun(参数);
LIB文件会确保连接。为MSVC可执行文件配置BCB DLL(不是虚假DLL)。
EagleFew 2008-06-04
  • 打赏
  • 举报
回复
呵呵,问题自己解决了
多谢各位捧场
xabcxyz 2008-06-03
  • 打赏
  • 举报
回复
borland 和 microsoft 的lib二进制格式不一致,所以你还是动态调用吧
一款用于共享软件加密的动态链接库文件,包含了获取硬盘物理序列号及BlowFish、MD5、SHA512、RIPEMD160、Secret16、MD5FileCheck、CRCFileCheck等多种强大加密算法,可以非常方便的用于软件的各类加密需求。支持VC/VB/BCB/Delphi等各类Windows平台下的开发工具,软件同时提供详细的函数定义说明、示例及各类开发工具使用的源代码。 软件功能: (1)可用于获取硬盘序列号(IDE/SCSI),支持Win9x/Me/NT/2000/XP。 (2)内置BlowFish、MD5、SHA512、RIPEMD160、Secret16、MD5FileCheck、 CRCFileCheck等多种强大加密算法来对软件进行加密保护。 (3)支持Window平台下的各类开发工具,如VC/VB/BCB/Delphi/PB/VFP等。 (4)可以非常方便的同时使用多种加密算法来对软件进行加密保护。 打包文件说明: Reg.dll-------------------加密算法动态链接库文件。 Reg.h---------------------在 VC(C/C++) 和 BCB 开发环境下的头文件。 Reg.lib-------------------在 VC(MFC) 开发环境下的 Library 文件。 Reg.bas-------------------在 VB 开发环境下的 Module 文件。 Readme.txt----------------纯文本格式说明文件。 Help.chm------------------函数接口详细定义说明文件。 MFC_TestEncryDll.zip------MFC调用Reg.dll进行加密示例。 VB6_TestEncryDll.zip------VB6调用Reg.dll进行加密示例。 CB5_TestEncryDll.zip------BCB5调用Reg.dll进行加密示例。 Delphi_TestEncryDll.zip---Delphi调用Reg.dll进行加密示例。 函数详细说明请参见Help.chm中具体函数说明部分及相关示例代码。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧