代码之家  ›  专栏  ›  技术社区  ›  Sukasa

vb6 dll将回调作为整数,vb.net需要委托引用类型

  •  2
  • Sukasa  · 技术社区  · 15 年前

    我有一个问题与第三方COM+DLL打算使用从vb6,在那里它有一个函数设置一个硬件事件的回调。但是,我使用的是vb.net,AddressOf现在返回的是引用类型而不是整型,这意味着显然不能使用com+dll上的setCallback函数。

    是否有解决此问题的方法(我没有可用的VB6来开发某种包装),或者我必须找到其他第三方DLL才能使其正常工作?作为参考,我正在尝试访问Logitech G15(V2)键盘上的LCD。

    这里是setcallback函数和回调的原型本身,供参考:

    Public Sub setCallback(funcAddr As Integer)
    Public Sub LCDbuttonPress(ByVal butStates As Integer)
    
    1 回复  |  直到 15 年前
        1
  •  3
  •   John Knoeller    15 年前

    我认为如果您像这样声明setcallback函数:

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

    我不是一个vb用户,所以我不知道确切的语法。但这里的基本思想是,在vb.net中,您声明原型接受委托,甚至是正确类型的委托。但是,然后使用marshalas属性告诉marshalling代码将其作为另一端的函数指针(实际上是一个整数)来处理。我在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)