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

标签 vb.net vb6 com+ g15

我对从 VB6 开始使用的第三方 COM+ DLL 存在疑问,它有一个为硬件事件设置回调的函数。但是,我使用的是 VB.NET,AddressOf 现在返回引用类型而不是整型,这意味着 COM+ DLL 上的 setCallback 函数显然无法使用。

有没有办法解决这个问题(我没有可用的 VB6 来开发某种包装器),或者我必须找到不同的第 3 方 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# 中的这个

public delegate int MyProgress(double dPercentComplete);
...
int WaitWithProgress([MarshalAs(UnmanagedType.FunctionPtr)]MyProgress pfn);

在 C++ 一侧显示如下

HRESULT __stdcall WaitWithProgress (long pfn, int * pRetVal);

注意评论。这个问题的实际解决方案是 Marshal.GetFunctionPointerForDelegate() 并且请仔细阅读有关此问题的文档。如果您使用此方法,您有责任确保在 setCallback(NULL)

之前委托(delegate)不会被垃圾回收

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

相关文章:

vb6 - 如何在VB 6中检查对象的类型? -我不想使用'TypeOf'方法

.Net - session 外观和业务代表之间有什么区别?

vb.net - 捕获NullReferenceException或首先测试Nothing?

vb.net - 如何使用vb.net在 TreeView 控件中从下到上查找子节点的所有父节点

html - WebBrowser 在 vb6 WebBrowser 中阻止 AdSense 广告代码

C# - 检索 COM+ 组件的属性?

c# - COM+ 包装 ServiceStack (NService.Kit) Redis 客户端排队 VBScript 请求

mysql - .Net session ,如何获取数据

c# - .NET 最小化到托盘并最小化所需资源

vb6 - VB6 中的字节数组到有符号整数