在VC中调用C++Builder生成的动态连接库

tim 2000-01-25 05:32:00
最近用VC(6.0)调用一个用C++Builder生成的动态连接库,遇到点麻烦,还请高手援手。
在CBuilder中代码如下:
extern "C" void WINAPI __declspec(dllexport) ShowAbout()
{
...
}
生成动态连接库tim.dll后,用dumpbin /EXPORTS tim.dll 查看,有:
...
8 7 ShowAbout
9 8 _Form1
...
于是写了一个tim.def文件,其中有:
ShowAbout @8
再用 lib /DEF:tim.dll 生成 tim.lib 及 tim.exp
在VC写的程序中加入以下代码:
extern "C"
{
void _delcspec(dllexport)ShowAbout(void);
}

void CMainFrame::OnAppAbout()
{
ShowAbout();
}
编译通过,但连接时出现:
"error LNK2001: unresolved external symbol _ShowAbout"
猜想可能是编译器产生符号的方法不同,于是将CBuilder中ShowAbout改为_ShowAbout,按以上过程重新做一遍,结果在DLL中的符号的确为_ShowAbout了,但连接时仍出现
"error LNK2001: unresolved external symbol _ShowAbout"
请各位帮忙,多谢。

...全文
321 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowCan 2000-02-15
  • 打赏
  • 举报
回复
TO:tim
我成功了,用动态加载可以。给我来Email,我有例子程序。
Tommy Chang 2000-02-02
  • 打赏
  • 举报
回复
coff和omf(希望没记错)是两种不同的dll格式,bcbuilder有个工具是转换的,或者使用loadlibary(动态加载),用编号而不用命名的办法来访问,但头部和库都没用了。
NowCan 2000-01-28
  • 打赏
  • 举报
回复
你可能没有理解我的意思。动态加载不需要在Project 中加入Lib文件,不过程序比较复杂。我做过与你相反的事,即在C++builder3中调用VC生成的DLL。我再试史吧。
tim 2000-01-28
  • 打赏
  • 举报
回复
TO:NowCan
连接就通不过,怎么动态加载?
对了,如果你做过类似的事,告诉我你是怎么做的,我按你的方法试一试
NowCan 2000-01-28
  • 打赏
  • 举报
回复
怎么会这样?真怪!!!!!!!
要么试一试动态加载:LoadLibrary(),GetProcAddress(),Freelibrary().
NowCan 2000-01-27
  • 打赏
  • 举报
回复
你把程序Mail to me. 或者再编一个有问题的程序给我,我仔细研究研究。
liukai1111@263.net
NowCan 2000-01-27
  • 打赏
  • 举报
回复
在CBuilder中这样写
extern "C" void __stdcall __declspec(dllexport) ShowAbout()
{
........

}
tim 2000-01-27
  • 打赏
  • 举报
回复
程序很简单,为了搞定问题,我已经去掉了所有废话。
只有上面的东西是自己加的。
实际上让我迷惑的有两个问题:
1、怎样让VC产生符号时保持原来的摸样不变;
(我看了一下DB-LIBARY的动态连接库中函数名也未变,它的头文件申明为
extern "C"
{
extern RETCODE SQLAPI dbclose (PDBPROCESS);
}
的摸样,其中SQLAPI是一个宏,替换为_cdecl,但我用
extern "C"
{
extern void _cdecl ShowAbout(void);
}
仍然不兆)
2、为什么将CBuilder中函数名改为_ShowAbout后仍然不兆呢?是不是使用制作的.lib文件有问题,对了,怎么才能看到一个.lib文件有没有包含某个函数呢?
SuperChen 2000-01-26
  • 打赏
  • 举报
回复
不好意思,给一个低级的答复:再把VC中的声明改为 extern "C" void _ShowAbout(void)再试试看。
NowCan 2000-01-26
  • 打赏
  • 举报
回复
在VC++中这样写
extern "C" void __stdcall ShowAbout(void);

tim 2000-01-26
  • 打赏
  • 举报
回复
不行啊,生成的符号是_ShowAbout@0
tim 2000-01-25
  • 打赏
  • 举报
回复
好象不行。
1、在CBuilder中加上_stdcall,
extern "C" void _stdcall __declspec(dllexport) ShowAbout(void)
{
...
}
编译后产生的符号仍然是ShowAbout
2、在VC中加上_stdcall后,与_declspec(dllexport)有冲突(warning C4518),而且产生的符号为_ShowAbout@0,与CBuilder生成的结果相差更大了。
不过也许我的理解有误,两位不妨好人做倒底,把代码写出来看看。
blaise 2000-01-25
  • 打赏
  • 举报
回复
yes.
And in your original code,if you pass some paramter,you may get a crash,have a try.It's from call convention.
chenlei 2000-01-25
  • 打赏
  • 举报
回复
在bc和vc的声明中都改为stdcall,应该就可以了。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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