2

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

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

作为参考,这里是 setCallback 函数和回调的原型本身:

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

1 回答 1

3

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

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

我不是 VB 人,所以我不知道确切的语法。但这里的基本思想是,在 VB.Net 中,您将原型声明为接受委托,甚至是正确类型的委托。但随后您使用 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() 并且要小心阅读有关此问题的文档。如果您使用此方法,您有责任确保在您之前不会对委托进行垃圾收集setCallback(NULL)

于 2009-12-21T02:06:56.060 回答