发信人: lofe ()感激生活(), 信区: BorlandDev
标 题: 动态链结函式库(Dynamic Linked Library)(8)
发信站: 哈工大紫丁香 (2000年08月30日19:53:17 星期三), 站内信件
语言双雄' C++Builder 和Visual C++ 连结
前面我们已经把关於C++Builder撰写DLL所应注意到的事项介绍完了,现在我们来谈另
一个重点 - C++Builder和Visual C++ 的连结。若是你没有使用过Visual C++ 的话,
可以将此部份略去。若是你在程式设计时必须使用到Visual C++ 的DLL或是必须提供
DLL给VC++ 或是VB使用时,也许会带给你意想不到的收获。
VC++ 使用C++Builder的DLL函式
在Visual C++ 中使用C++Builder的DLL的函式方法和在C++Builder中使用大同小异,
唯有几件事情必须要注意。
(一)Visual C++ 的LIB档格式和C++Builder的LIB格式不同,因此你必须重新产生一
个 LIB。不过,可惜的是VC++ 在32位元的版本中并未提供IMPLIB.EXE函式(这点一直
令许多人百思不解),因此你无法很方便地产生LIB档。解决方法有二:其一是在VC++
内撰写一个同名称的空的DLL函式,令其产生LIB档,其二则是使用 LoadLibrary、
GetProcAddress式的明确呼叫方式。
(二)使用前面提到的标准写法。
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做为结束。
[Image] (略)
此程式的关键程式码如下:
void CVcusedllApp::OnAppAbout()
{
void (*ShowImage)(void);
HINSTANCE hInst;
hInst = LoadLibrary("DLLSAMP2.DLL");
(FARPROC &)ShowImage=GetProcAddress(hInst,"ShowImage");
ShowImage();
FreeLibrary(hInst);
}
--
真正的程序员用C, 聪明的程序员用什么?——Inprise工具!
欢迎光临BorlandDev版,探讨Inprise编程
独孤九剑的最高境界是不拿剑
编程的最高境界是无所谓工具
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: malacs.hit.edu.cn]
※ 修改:·lofe 於 08月30日20:02:45 修改本文·[FROM: malacs.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.029毫秒