VB6 DLL将回调作为Integer,VB.NET需要委托引用类型

时间:2009-12-21 01:16:14

标签: vb.net vb6 com+ g15

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

有没有解决这个问题的方法(我没有VB6可用于开发某种包装器),或者我是否必须找到一个不同的第三方DLL才能使其工作?作为参考,我正在尝试使用Logitech G15(v2)键盘访问LCD。

For Reference,这里是setCallback函数和回调的原型本身:

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

1 个答案:

答案 0 :(得分:3)

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

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

我不是VB人,所以我不知道确切的语法。但这里的基本思想是,在VB.Net中,您将原型声明为委托,甚至是正确类型的委托。但是,然后使用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)

之前不会对代理进行垃圾回收