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