创建“通用的”动态链接库(DLL)

http://www.vckbase.com/index.php/wv/9


  • 文章概要:
  • 最近有许多人问如何让动态链接库的输出函数能够被任何支持动态链接库的语言调用。写动态链接库是很EASY的事情。但是,他们大多觉得输出的名字有乱字符(如:_vbShiftRight@1)。本文将讨论如何让DLL输出的函数名字中不出现乱子符。以便让创建的DLL可以在VB中使用。





最近有许多人问如何让动态链接库的输出函数能够被任何支持动态链接库的语言调用。写动态链接库是很EASY的事情。但是,他们大多觉得输出的名字有乱字符(如:_vbShiftRight@1)。本文将讨论如何让DLL输出的函数名字中不出现乱子符。以便让创建的DLL可以在VB中使用。

首先需要实现DLL的入口点函数并保证代码使用 stdcall 调用规范,但这要依赖你使用的编译器。例如,你可以在VC中使用“/entry:"DLLEntry"”命令行编译选项来创建自己的入口点。“DLLEntry” 可以参考下列代码:

01. /
02. // DLL initialization and clean-up.
03. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOIDlpvReserved)
04. {
05. switch(fdwReason) {
06.  
07. case DLL_PROCESS_ATTACH:
08.  
09. // Perform any DLL initialization here
10. break;
11.  
12. case DLL_PROCESS_DETACH:
13.  
14. // Perform any DLL cleanup here
15. break;
16.  
17. }
18. return TRUE;
19. }

为了保证你使用正确的调用规范,要通知编译器使用stdcall规范和/或使用在windows.h(及相关文件)中定义的常量,如WINAPI等。通常DLL的代码如下:

1. /
2. // Shifts bits right for integers.
3. WORD WINAPI vbShiftRight(WORD nValue, WORD nBits)
4. {
5. return (nValue >> nBits);
6. }

下一步是创建一个DEF文件,与文档中描述的做法稍有不同。这是防止输出函数名不出现乱字符的有效方式(如_vbShiftRight@1)。DEF文件的形式如下:

EXPORTS

vbShiftRight

下一步是在VB中调用这个函数,使用以下声明:

01. Declare Function vbShiftRight Lib "MYDLL.DLL" (ByVal nValue As Integer,
02. ByVal nBits As Integer)
03.  
04. As Integer
05.  
06. Sub Test()
07. Dim i As Integer
08. i = vbShiftRight(4, 2)
09. Debug.Assert i = 1
10. End Sub

如果你还想要更容易的方法从VB中调用,可以创建一个类型库。为此你需要创建和编译ODL(对象描述语言)文件。这个文件应该包含如下内容:

1. module MyModule {
2. [
3. helpstring("Shifts the bits of an integer to the right."),
4. entry("vbShiftRight")
5. ]
6. short _stdcall vbShiftRight([in] short nValue, [in] short nBits);
7. };

当VB加载DLL的类型库时,函数名和参数将出现在VB的对象浏览器中。此外,如果用户不输入正确的参数类型,VB将产生一个错误。
























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值