我必须将用C编写的dll的一些函数导入到VB6项目中。我有一个用C#写的例子,但我真的不知道如何在VB6中做同样的事情。
在C#中,它是这样的:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int someCallback(IntPtr ch, uint chL, IntPtr cbData);
[DllImport("someDLL.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int someFunction(IntPtr con, someCallback callback, IntPtr cbData);
示例中调用someFunction
时一切正常。
dll的文档只给了我这个:
typedef int(SOMEAPI_CALL * someCallback)(const unsigned char *ch,
unsigned int chL,
void *cbData)
SOMEAPI_CALL someFunction(Con* con,
someCallback callback,
void* cbData)
在VB6中应该有同样的方法,但我对这种语言没有太多经验。在网上搜索了很长时间,但没有找到任何可以帮助我的东西。
我知道如何在我的项目中声明dll中的函数,但仅此而已。如何将这个UnmanagedFunctionPointer
的东西转换成VB6代码,我只是不知道。
VB6没有VB.NET(和C#(那样的属性,而且注释无论如何都是不必要的。您可以通过AddressOf
运算符将一个函数指针传递给一个C API函数:
Declare Function someFunction Lib "someDLL" ( _
ByVal con As Long, _
ByVal callback As Long, _
ByVal data As Long _
) As Long
…
Call someFunction(con, AddressOf SomeCallback, data)
但即使这样也不起作用,因为VB6不支持使用cdecl调用约定的本机互操作,它只支持stdcall。您要么需要使用stdcall调用约定重新编译DLL,要么在C或IDL中创建一个包装器(有一些技巧使用内联汇编来包装单个cdecl调用,但我不建议使用这些(。