gpt4 book ai didi

c - 在 VB6 中使用来自 C-Dll 的回调

转载 作者:行者123 更新时间:2023-12-04 10:11:30 24 4
gpt4 key购买 nike

我必须将用 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 函数。运算符(operator):

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 调用约定的 native 互操作,它只支持 stdcall。您将需要使用 stdcall 调用约定重新编译 DLL,或者在 C 或 IDL 中创建一个包装器(有一些使用内联汇编来包装单个 cdecl 调用的技巧,但我不建议使用这些)。

关于c - 在 VB6 中使用来自 C-Dll 的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61318382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com