VC调用BCB的DLL中的类函数遇到的问题

puddingli mfc  2015-07-15 07:22:43
有一个别人用BCB做的dll(TDIcom.dll),我想通过VC来调用它。(用的是VS2010)
以前其他BCB的dll中的非类函数都能解决,但是这次碰到个dll里面有个类LibTDI,调用时候一直出错,该怎么解决?谢谢。
错误如下:
1>xrayworkerDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall LibTDI::LibTDI(void)" (__imp_??0LibTDI@@QAE@XZ),该符号在函数 "public: __thiscall CxrayworkerDlg::CxrayworkerDlg(class CWnd *)" (??0CxrayworkerDlg@@QAE@PAVCWnd@@@Z) 中被引用
1>xrayworkerDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: int __thiscall LibTDI::Set_TDI_V2(int,int,int)" (__imp_?Set_TDI_V2@LibTDI@@QAEHHHH@Z),该符号在函数 __catch$?OnInitDialog@CxrayworkerDlg@@MAEHXZ$0 中被引用
1>xrayworkerDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: int __thiscall LibTDI::TDI_SwitchGear(int)" (__imp_?TDI_SwitchGear@LibTDI@@QAEHH@Z),该符号在函数 __catch$?OnInitDialog@CxrayworkerDlg@@MAEHXZ$0 中被引用
1>xrayworkerDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: int __thiscall LibTDI::CheckConnection(void)" (__imp_?CheckConnection@LibTDI@@QAEHXZ),该符号在函数 __catch$?OnInitDialog@CxrayworkerDlg@@MAEHXZ$0 中被引用
1>xrayworkerDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: bool __thiscall LibTDI::Connect(void)" (__imp_?Connect@LibTDI@@QAE_NXZ),该符号在函数 __catch$?OnInitDialog@CxrayworkerDlg@@MAEHXZ$0 中被引用
1>xrayworkerDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: void __thiscall LibTDI::Disconnect(void)" (__imp_?Disconnect@LibTDI@@QAEXXZ),该符号在函数 "public: void __thiscall CxrayworkerDlg::OnBnClickedCancel(void)" (?OnBnClickedCancel@CxrayworkerDlg@@QAEXXZ) 中被引用
1>D:\Projects\xrayworker\Debug\xrayworker.exe : fatal error LNK1120: 6 个无法解析的外部命令


通过BCB的IMPDEF工具生成的TDIcom.def,内容:

LIBRARY TDICOM.DLL

EXPORTS
@LibTDI@BinToInt$q3USC @2 ; LibTDI::BinToInt(USC)
@LibTDI@CheckConnection$qv @6 ; LibTDI::CheckConnection()
@LibTDI@Connect$qv @1 ; LibTDI::Connect()
@LibTDI@Disconnect$qv @5 ; LibTDI::Disconnect()
@LibTDI@Get_TDI_V2$qii @8 ; LibTDI::Get_TDI_V2(int, int)
@LibTDI@IntToBin$qus @3 ; LibTDI::IntToBin(unsigned short)
@LibTDI@OnWait$qv @7 ; LibTDI::OnWait()
@LibTDI@Set_TDI_V2$qiii @9 ; LibTDI::Set_TDI_V2(int, int, int)
@LibTDI@TDI_SwitchGear$qi @10 ; LibTDI::TDI_SwitchGear(int)
@LibTDI@checksum$qpucus @4 ; LibTDI::checksum(unsigned char *, unsigned short)
___CPPdebugHook @11 ; ___CPPdebugHook


头文件tdi.h,就是主程序调用里面的LibTDI类的函数出错的

//tdi.h

#ifndef TDI_H
#define TDI_H

#ifdef _CLASSINDLL
#define CLASSINDLL_CLASS_DECL __declspec(dllexport)
#else
#define CLASSINDLL_CLASS_DECL __declspec(dllimport)
#endif

#define TDI_VER 1
#define TDI_SPD 2
//#define TDI_LINES 3
//#define TDI_GAIN 4
#define TDI_GAIN_V2 3
//#define TDI_OFFSET 5
#define TDI_OFFSET_V2 4
//#define TDI_V2_GAIN_OFFSET 3
#define TDI_CMD_END 0x0D
#define TDI_CMD_END2 0x0A


#define ERR_TDI_232_DISCONNECT -1
#define ERR_TDI_232_NORESPOND -2
#define ERR_TDI_PCI_NOHANDLE -3
#define ERR_TDI_PCI_FUNCNOLOAD -4
#define ERR_TDI_CMD_OK 1
#define ERR_TDI_CMD_SYNTAXERR -5//s
#define ERR_TDI_CMD_UNKNOWN -6

#define TDI_SENSORNUM 20
#define TDI_SENSOR_PIXELNUM 143
#define TDI_AVAILABLE_SENSOR_PIXELNUM 138
#define TDI_AVAILABLE_SENSOR_PIXELNUM_OFFSET 2
#define TDI_UNCERTAIN_LINES 20

#define TDI_STAR 1
#define TDI_STOP 2
#define TDI_HVOLTAGE_ON 3
#define TDI_HVOLTAGE_OFF 4

#define TDI_INTEGRAL_FACTOR 0.75/270.0


#define TDI_PIXEL_MEASURE 15.0
#define TDI_LINE_INTEGRAL_TIME(value) TDI_INTEGRAL_FACTOR*value
#define TDI_LINE_TRANS_TIME(value) TDI_INTEGRAL_FACTOR*1000+(value-270)*TDI_INTEGRAL_FACTOR
class USC{
public:
BYTE high ;
BYTE low ;
USC(){high=0;low=0;}
USC(BYTE h,BYTE l)
{
high=h;
low=l;
}
} ;

#pragma comment(lib,"TDIcom.lib")
class CLASSINDLL_CLASS_DECL LibTDI {

void OnWait();
BYTE checksum(BYTE *list,WORD len);
WORD BinToInt(USC c) ;
USC IntToBin(WORD c) ;

public:
LibTDI(){};
bool Connect();
void Disconnect();
BOOL CheckConnection();

int Get_TDI_V2(int code,int para);
BOOL Set_TDI_V2(int code,int para,int para2);
BOOL TDI_SwitchGear(int type) ;
};
#endif

...全文
250 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
puddingli 2015-07-31
引用 18 楼 u010030181 的回复:
[quote=引用 17 楼 mjdy123 的回复:] [quote=引用 16 楼 u010030181 的回复:] 出现这个有很多的原因的,你那个dll是运行在32?还是64?位操作系统下,如果你的DLL是64位的,在win32下调用也会出现那个错误...
运行在64位操作系统下,dll应该是32位的[/quote] http://www.pediy.com/kssd/pediy06/pediy6181.htm http://www.codeguru.com/cpp/w-p/dll/importexportissues/article.php/c123/Explicitly-Linking-to-Classes-in-DLLs.htm 最近我也想直接用VC调用BCB的DLL(包含类的),后来发现是函数名扩展的问题,因为两个平台对C++的函数名进行扩展不一样,就算你直接修改def文件生成了可供VC调用的lib,也没有用的……因为你lib可能生成对了,但是调用dll时又不是原来的的那个函数名了……上面两个连接或许有用,但我没实验,不过就算有用,也可能会出现莫名其妙的错误,《window核心编程》中提到:只有当导出C++类的模块使用的编译器与导入C++类的模块的开发人员与DLL模块的开发人员使用的是相同的工具包,否则我们应该避免从DLL中导出C++类,而且现实的情况也确实如此。[/quote] 谢谢,我先试试写一个新的dll,包裹在原来的DLL外面,看看这种方法行不行
回复
QIUSQJF 2015-07-30
引用 17 楼 mjdy123 的回复:
[quote=引用 16 楼 u010030181 的回复:] 出现这个有很多的原因的,你那个dll是运行在32?还是64?位操作系统下,如果你的DLL是64位的,在win32下调用也会出现那个错误...
运行在64位操作系统下,dll应该是32位的[/quote] http://www.pediy.com/kssd/pediy06/pediy6181.htm http://www.codeguru.com/cpp/w-p/dll/importexportissues/article.php/c123/Explicitly-Linking-to-Classes-in-DLLs.htm 最近我也想直接用VC调用BCB的DLL(包含类的),后来发现是函数名扩展的问题,因为两个平台对C++的函数名进行扩展不一样,就算你直接修改def文件生成了可供VC调用的lib,也没有用的……因为你lib可能生成对了,但是调用dll时又不是原来的的那个函数名了……上面两个连接或许有用,但我没实验,不过就算有用,也可能会出现莫名其妙的错误,《window核心编程》中提到:只有当导出C++类的模块使用的编译器与导入C++类的模块的开发人员与DLL模块的开发人员使用的是相同的工具包,否则我们应该避免从DLL中导出C++类,而且现实的情况也确实如此。
回复
puddingli 2015-07-29
引用 16 楼 u010030181 的回复:
出现这个有很多的原因的,你那个dll是运行在32?还是64?位操作系统下,如果你的DLL是64位的,在win32下调用也会出现那个错误...
运行在64位操作系统下,dll应该是32位的
回复
QIUSQJF 2015-07-27
出现这个有很多的原因的,你那个dll是运行在32?还是64?位操作系统下,如果你的DLL是64位的,在win32下调用也会出现那个错误...
回复
puddingli 2015-07-23
求助各位大牛啊~一直没能解决~
回复
赵4老师 2015-07-18
将错误信息中出现的标识符放在百度里面搜一下,看其在哪个.lib中,然后在本地硬盘上搜索该.lib,如果没有,在网上搜索相关库或模块下载安装,然后将其所在目录填写到“附加依赖库所在目录”中,将其名字添加到“附加依赖库”中,重新连接。 VC6: 工程、设置、C/C++、分类:Preprocessor、附加包含路径:填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类:Input、附加库路径:填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类:Input、对象/库模块:填写附加依赖库的名字.lib 空格间隔多项 VS20xx: 项目、属性、C/C++、附加包含目录:填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录:填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项:填写附加依赖库的名字.lib 空格或分号间隔多项
回复
worldy 2015-07-18
#pragma comment(lib,"TDIcom.lib")//必须确认TDIcom.lib文件存在
回复
puddingli 2015-07-18
不行~我按上面10L,11L,12L的方法都试了~还是一样的错误~绝对路径也不行~lib文件确认存在~属性里面也加上了~还是一样~ 我百度了一下~是不是我前面用BCB的IMPDEF从TDIcom.dll导出的def要修改一下格式?然后再用修改好的def生成lib。那这个def该怎么改才能让VC来用?
回复
puddingli 2015-07-18
引用 10 楼 yaozhiyong110 的回复:
[quote=引用 7 楼 mjdy123 的回复:] [quote=引用 6 楼 yaozhiyong110 的回复:] 你这个是没链接上 lib的问题...
我在头文件tdi.h里加入了#pragma comment(lib,"TDIcom.lib") 还是出错。 还有其他要加的地方吗?[/quote] 那有可能是你TDIcom.lib放置的位置不对 你先用绝对路径试试...[/quote] 不行~我按上面10L,11L,12L的方法都试了~还是一样的错误~绝对路径也不行~lib文件确认存在~属性里面也加上了~还是一样~ 我百度了一下~是不是我前面用BCB的IMPDEF从TDIcom.dll导出的def要修改一下格式?然后再用修改好的def生成lib。那这个def该怎么改才能让VC来用?
回复
yaozhiyong110 2015-07-17
引用 7 楼 mjdy123 的回复:
[quote=引用 6 楼 yaozhiyong110 的回复:] 你这个是没链接上 lib的问题...
我在头文件tdi.h里加入了#pragma comment(lib,"TDIcom.lib") 还是出错。 还有其他要加的地方吗?[/quote] 那有可能是你TDIcom.lib放置的位置不对 你先用绝对路径试试...
回复
puddingli 2015-07-17
引用 8 楼 redui 的回复:
你确定你包含它的头文件时没有定义_CLASSINDLL宏?必须不能定义这个宏,否则系统认为是你在导出类,因此到处找符号的实现,结果找不到。 如果不确定,在#include "tdi.h"之前加上 #undef _CLASSINDLL试试
没有定义,我直接把class CLASSINDLL_CLASS_DECL LibTDI换成class __declspec(dllimport) LibTDI也不行
回复
redui 2015-07-17
你确定你包含它的头文件时没有定义_CLASSINDLL宏?必须不能定义这个宏,否则系统认为是你在导出类,因此到处找符号的实现,结果找不到。 如果不确定,在#include "tdi.h"之前加上 #undef _CLASSINDLL试试
回复
puddingli 2015-07-17
引用 6 楼 yaozhiyong110 的回复:
你这个是没链接上 lib的问题...
我在头文件tdi.h里加入了#pragma comment(lib,"TDIcom.lib") 还是出错。 还有其他要加的地方吗?
回复
yaozhiyong110 2015-07-17
你这个是没链接上 lib的问题...
回复
puddingli 2015-07-17
@要追问请引用回复 @yaozhiyong110 @oyljerry 求助各位大牛,谢谢。 这个dll我不确定是否是BCB做的,不过应该没有包含BCB特有的函数,只不过头文件原来是用在BCB里面的。主要是碰到这个类,不知道该怎样调用。
回复
puddingli 2015-07-16
引用 2 楼 fhw_bin_dl 的回复:
可能是BCB生成的lib格式较旧,VS2010无法识别。
我通过VC++的LIB工具用TDIcom.def新生成了一个lib
回复
fhw217 2015-07-15
BCB对类函数的修饰方法与VC不一样。
回复
fhw217 2015-07-15
可能是BCB生成的lib格式较旧,VS2010无法识别。
回复
puddingli 2015-07-15
我在主程序里需要用LibTDI类定义一个成员变量 LibTDI tdi; 然后在各个成员函数里调用tdi里的函数
回复
相关推荐
发帖
Windows SDK/API
创建于2007-08-02

1206

社区成员

C++ Builder Windows SDK/API
申请成为版主
帖子事件
创建了帖子
2015-07-15 07:22
社区公告
暂无公告