gpt4 book ai didi

vb.net - VB6 DLL 将回调作为整数,VB.NET 需要委托(delegate)引用类型

转载 作者:行者123 更新时间:2023-12-04 07:00:29 27 4
gpt4 key购买 nike

我对打算从 VB6 使用的第三方 COM+ DLL 有疑问,它具有为硬件事件设置回调的功能。但是,我使用的是 VB.NET,并且 AddressOf 现在返回引用类型而不是整数类型,这意味着 COM+ DLL 上的 setCallback 函数显然不能使用。

有没有办法解决这个问题(我没有可用的 VB6 来开发某种包装器),还是我必须找到一个不同的 3rd-party DLL 才能让它工作?作为引用,我正在尝试访问 Logitech G15(v2) 键盘上的 LCD。

作为引用,这里是 setCallback 函数和回调的原型(prototype)本身:

Public Sub setCallback(funcAddr As Integer)
Public Sub LCDbuttonPress(ByVal butStates As Integer)

最佳答案

我想如果你像这样声明你的 setCallback 函数:

Public Sub setCallback([MarshalAs(UnmanagedType.FunctionPtr)]funcAddr as function)

我不是 VB 人,所以我不知道确切的语法。但这里的基本思想是,在 VB.Net 中,您将原型(prototype)声明为接受委托(delegate),甚至是正确类型的委托(delegate)。但随后您使用 MarshalAs 属性告诉编码代码将其视为另一端的函数指针(实际上是整数)。我在 C# 中这样做是为了将回调传递给 C++ 代码,它工作得很好。

例如 C# 中的 this
public delegate int MyProgress(double dPercentComplete);
...
int WaitWithProgress([MarshalAs(UnmanagedType.FunctionPtr)]MyProgress pfn);

像这样出现在房子的 C++ 端
HRESULT __stdcall WaitWithProgress (long pfn, int * pRetVal);

注意评论。这个问题的实际解决方案原来是 Marshal.GetFunctionPointerForDelegate()并仔细阅读有关此的文档。如果您使用此方法,您有责任确保在您之前没有对委托(delegate)进行垃圾回收 setCallback(NULL)

关于vb.net - VB6 DLL 将回调作为整数,VB.NET 需要委托(delegate)引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1937734/

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