c++ builder调用VC的lib文件问题

dwtrace 2011-04-09 02:08:31
我有一个动态库——dd.dll用vs 2010写的,在VC中编译出它的lib文件——dd.lib、大小3K,现在我在c++ builder 2007中想静态调用这个动态库里的函数。
我的做法:用 implib ddd.lib dd.dll,生成新的lib文件,但是这个生成的新lib文件大小只有1K,而且把新生成的lib加入到project里,编译时报错,说找不到我要调用动态库里函数的代码。

后来我又试着用coff2omf dd.lib ddd.lib,但新生成的ddd.lib大小也只有1K,加入工程中编译是也报错,找不到函数的代码。

静态调用时,我已经把.lib和.h加入到工程中,DLL也加入了,但问题如上所述,请高手指教!感谢!

...全文
449 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dwtrace 2011-04-22
  • 打赏
  • 举报
回复
总结下:VC写的dll,在BC中是可以调用的。只要把调用约定设定好。能后大家都用extern "C"进行编译。

BC和VC的类编译方式不同,所以只能调用函数,VC中导出的类是无法再BC中调用的
KevinHo 2011-04-13
  • 打赏
  • 举报
回复
如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入库(lib文件)可能会与应用程序的开发平台所要求的导入库格式不相容,从而在应用程序与动态库隐式链接时,出现程序链接错误:contains invalid OMF record。例如在C++Builder开发平台上链接Visual C++制作的动态库时,就会出现上述的错误。解决这一问题,可以采用两种方法:显式连接法和使用C++Builder中提供的导入库生成工具。

  显式连接:显式连接不需要在工程中加入导入库和相应的头文件,只需要把动态库放入指定的目录下。在应用程序中通过函数调用显式的装载和卸掉DLL,通过函数指针来调用DLL的导出函数。

  步骤:

  1. 调用LoadLibrary函数装载DLL并得到模块句柄;
  2. 调用GetProcAddress函数获取指定导出函数的指针;
  3. 用这个函数的指针调用该函数;
  4. 使用完毕后,用FreeLibrary释放DLL。
mhss9301 2011-04-12
  • 打赏
  • 举报
回复
implib -a *.lib *.dll
draculamx 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhouzhangkui 的回复:]
做dll的时候 自己注意点就行了

VC生成DLL,C++Builder调用。
1、用extern "C"修饰VC导出的DLL函数。如:extern "C" __declspec(dllexport) int aFunc(int a);
2、用C++Builder的implib工具生成DLL对应的lib文件。如:implib -a xxx.lib xxx.dll(注意,implib一定要带……
[/Quote]

补充一下,那个用 vc 做的 dll,最好不要使用 MFC,最好不要导出类。。。
ccrun.com 2011-04-10
  • 打赏
  • 举报
回复
首先要保证导出函数的调用约定要一致,比如都用__stdcall的方式。
其次C++Builder能识别的Lib格式和VC生成的Lib有差异,建议用implib自己生成。
最后每个导出函数的参数,尽量用标准的数据类型。
rickys2080 2011-04-09
  • 打赏
  • 举报
回复
动态调用:
/*******************  下面开始使用动态库 ***********************/
int ret;
AnsiString m_Disp = " china";
unsigned char cmd[2],ack;
cmd[0] = sizeof(sendbuf) / 256; //需要发送的字节数量的长度的高 8 位
cmd[1] = sizeof(sendbuf) % 256; // 低 8 位

//下面是动态库的使用
HINSTANCE handle;
FARPROC lpFarProc;
int __stdcall (*pFun)(int,unsigned char*,int,int);//change

handle = LoadLibrary("zyUSBDev.dll");
lpFarProc = GetProcAddress(handle, "zyUSB_ReadData");
pFun = (int(__stdcall*)(int,unsigned char*,int,int))lpFarProc; //__cdecl

//用逻辑端点2, 接收来自 USB 设备的大量数据
周药师 2011-04-09
  • 打赏
  • 举报
回复
做dll的时候 自己注意点就行了

VC生成DLL,C++Builder调用。
1、用extern "C"修饰VC导出的DLL函数。如:extern "C" __declspec(dllexport) int aFunc(int a);
2、用C++Builder的implib工具生成DLL对应的lib文件。如:implib -a xxx.lib xxx.dll(注意,implib一定要带-a开关)。生成lib文件之后,C++Builder便可以使用这个lib文件了。


http://topic.csdn.net/u/20090302/17/99d1fbc5-4be6-4744-96d9-09b16c0d93c3.html?62703
dwtrace 2011-04-09
  • 打赏
  • 举报
回复
没人来光顾啊,自己顶下。在线等,回答OK马上结贴

13,825

社区成员

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

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