DLL函数的别名为什么不是DC240_OpenCamera,而是_DC240_OpenCamera@16
编号:QA003617
建立日期: 2000年12月2日 最后修改日期:2000年12月2日
所属类别:
齐鹏:
我是一位使用VB6.0开发工具的软件开发人员,一个月前拜读了您的<>,令我受益非浅。现有一问题想请教:
我的程序运行在Windows 98操作系统下,用的开发工具是Visual Basic 6.0.我按照柯达公司提供的SDK在VB6.0中声明其动态链接库函数,运行程序后发现SDK找不到函数的入口点。在不断测试后,发现把动态链接库函数的声明语句中的别名作些改动(在提供的库函数的原型前加一下划线,末尾加@(4或8, 12, 16, 20中的一位)),就能运行如常。例如: 改Public Declare Function DC240_OpenCamera Lib "DC3400.dll" Alias "DC240_OpenCamera" (Version As Integer, CameraData As Any, CommType As Any, USBRefNumber As Integer) As Integer
中的Alias "DC240_OpenCamera"为Alias"_DC240_OpenCamera@16" 后运行如常.
API调用中不是强调别名必须和函数原型完全一致吗?为什么这里必须要这样才能正常调用,而且这个@代表什么,为什么其后的数值是4的倍数?李老师,请您能帮我分析一下,如蒙赐教,不胜感激。
回答:
柯达公司提供的SDK估计是为VC++用户设计的,所以才会出现你说的问题。这在VC++编译中称为名称转换,主要是为了解决C++的多态问题。如果你懂VC++的话,可以参考QA003500 "做一个DLL时,不用def文件不行吗",它解释了为什么会有这个问题。前面的下划线是C语言编译时自动添加的。对于VC++用户来说,只要.h头文件声明正确,他在调用DLL时是无须考虑这些问题的,因为这些都是编译器自动进行的。不过对于VB或其他语言用户就比较麻烦了,因为DLL中并不存在DC240_OpenCamera,而只存在_DC240_OpenCamera@16,这一点你使用QA001064 "如何查看一个动态库中有哪些函数"介绍的方法看看DLL中到底有哪些函数就明白了。我们在QA003500 "做一个DLL时,不用def文件不行吗"说了,VC++中完全可以做到不使用名称转换,从而方便VB用户调用。对于柯达公司提供的SDK只能采用你说的办法了,不过如果你使用VC++编写DLL话,应该注意这个问题。
至于@后面的参数,实际上是进行函数调用时所需要的堆栈空间,按照VC++默认的选项,每个参数需要4个字节。
相关问题:
QA000585 "VB调用DLL时总说找不到入口点"
此问题由李海回答。
| |
|
|
| |
|
|