Using a callback from a C-Dll in VB6



我必须将用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调用,但我不建议使用这些(。

相关内容

  • 没有找到相关文章

最新更新