为什么我调用VC下编译的DLL在CB下使用却会出错?

ktcserver 2004-11-10 12:59:10
我在VC下编写了一个DLL文件,其中有两个导出函数
extern "C" __declspec(dllexport) CMyClass * CreateInst();
extern "C" __declspec(dllexport) void DelectInst(CCMyClass * pInst);

在VC下使用没有任何问题,
现在我在CB下使用,首先我在我的头文件中定义了我的类CMyClass,然后使用
extern "C" __declspec(dllimport) CMyClass * __cdecl CreateInst(void);
extern "C" __declspec(dllimport) void __cdecl DeleteInst(CMyClass *pInst);
来定义需要使用的函数
我将DLL文件通过implib MyDll.lib MyDll.dll生成了lib文件,并将该文件添加到了项目中,编译却会出错!
 我用impdef MyDll.def MyDll.dll 生成DEF文件
文件内容如下:
  LIBRARY MyDll.DLL
EXPORTS
CreateInst @1 ;CreateInst
DeleteInst @2 ;DeleteInst

我将其修改为:
  LIBRARY MyDll.DLL
EXPORTS
_CreateInst = CreateInst
_DeleteInst = DeleteInst
然后用implib MyDll.lib MyDll.def
生成LIB文件,可是编译还是会发生错误!

请问这是怎么回事啊!谁能给个解决方案呢?

...全文
153 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
GeoPhoenix 2004-11-11
  • 打赏
  • 举报
回复
是不是coff2omf.exe?
hao1first 2004-11-10
  • 打赏
  • 举报
回复
使用一个**2**的工具,可以解决,主要是两个的格式不同,**2**的工具、是bcb自带的,具体名字我忘了
fedcba9 2004-11-10
  • 打赏
  • 举报
回复
恩。学习。。。
tccsdn 2004-11-10
  • 打赏
  • 举报
回复
为了冲星,顶
特招 2004-11-10
  • 打赏
  • 举报
回复
extern "C" __declspec(dllexport) void __stdcall DelectInst(CCMyClass * pInst);
acneyouth 2004-11-10
  • 打赏
  • 举报
回复
你得用CBuilder的impLib生成lib文件。

如果还不行,参看下边的文章:
C++Builder中使用VC++ 的DLL函式


在C++Builder中使用VC++ 的DLL函式时要注意的是Microsoft在Visual C++ 中使用的特殊命名规则。在VC++ 中命名规则除了前面谈到的几项之外,它还使用了一个特殊的参数命名法,简言之,就是在函数名称後面加上参数的大小,这种命名方法会造成C++Builder,VB,Delphi使用的上的困扰。举例来说


extern "C" _declspec(dllexport) void __stdcall ShowImage(void);


在VC++ 中产生的函式名称为ShowImage@0(其中0表示参数大小),而不是如在C++Builder中产生的ShowImage,这是VC++ 已知的问题,这个问题也造成了很多使用non-VC++ 的使用者的问题,解决之道是在该DLL的DEF档中加上以下的叙述

EXPORTS

ShowImage=ShowImage@0

如此便可以产生正确的函式名了,若是你不想修改DEF档,你也可以在程式中加入以下的连结指引

#pragma comment(linker,"/exports:ShowImage=ShowImage@0")

假设你不确定其正确的名称,可以利用DumpBin或是TDump观察之。


以上是针对VC++ 的程式设计的所作的额外说明。最後我们以一个VC++ 程式呼叫本单元的About Dialog DLL做为结束。





此程式的关键程式码如下:

void CVcusedllApp::OnAppAbout()

{

void (*ShowImage)(void);

HINSTANCE hInst;

hInst = LoadLibrary("DLLSAMP2.DLL");

(FARPROC &)ShowImage=GetProcAddress(hInst,"ShowImage");

ShowImage();

FreeLibrary(hInst);

}
thp 2004-11-10
  • 打赏
  • 举报
回复
顶上去.

13,825

社区成员

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

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