我有一个第三方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)
答案 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)