【问题标题】:Callback to a powershell function of a COM object回调 COM 对象的 powershell 函数
【发布时间】:2019-03-02 09:43:14
【问题描述】:

很久以前,我创建了一个 COM 类,它可以做一些事情并提供回调注册:

HRESULT RegisterCallback([in] IUnknown* callbackFunction);

callbackFunction 的类型可以是 IDispatchICallbackHandler

interface IActionCallbackHandler : IUnknown {
    [id(1)] HRESULT ActionCallback(IActionCallbackData* data);
};

IDispatch 用于注册 VBScript 子程序作为回调方法例如:

Sub ProgressCallback (data)
     WScript.Echo data.Message
End sub

Set myObj= CreateObject("MyClass.MyClass")
myObj.RegisterCallback GetRef("ProgressCallback")

myObj.DoSomeActions //this method will call ProgressCallback()

然而,工程师们试图摆脱 VBScript 并用 powershell 代替一切。除了回调,一切都在 powershell 中工作。所以没有任何进展,他们也无法记录任何内容。

如何在 powershell 中实现这个回调?以与 VBScript 中相同的方式引用 powershell 函数将是完美的。这样,他们仍然可以使用他们的日志记录对象等。

【问题讨论】:

    标签: c++ powershell callback com


    【解决方案1】:

    以你的 vbs 为例:

    Sub ProgressCallback (data)
         WScript.Echo data.Message
    End sub
    
    Set myObj= CreateObject("MyClass.MyClass")
    myObj.RegisterCallback GetRef("ProgressCallback")
    
    myObj.DoSomeActions //this method will call ProgressCallback()
    

    您应该可以在 powershell 中这样做:

    $obj = New-Object -ComObject MyClass.MyClass
    $obj.RegisterCallback({param($data) $data.Message})
    $obj.DoSomeActions()
    

    如果您的目标是将其定义为一个函数(因为您将在其他地方重复使用它),您必须访问 Function 驱动器以获取脚本块定义:

    function ProgressCallback
    {
        param($data)
    
        $data.Message
    }
    $obj.RegisterCallback($Function:ProgressCallback)
    

    【讨论】:

    • 这行不通。回调发生时,线程上将没有运行空间来执行脚本块。
    • @x0n 通常脚本块会被类型转换为它需要作为委托的任何内容。
    • 是的,ScriptBlock.Invoke 的委托,它希望在 TLS(线程本地存储)槽中找到一个运行空间来实际执行脚本的解释。由于回调不会发生在 powershell 线程池线程上,因此不会有运行空间,并且您会收到一个错误,非常明确地说明这一点。如果线程之间没有编组,并且您在 STA 模式下运行 powershell.exe,并且对 DoSomeActions 的调用是同步的,那么您可能会很幸运。
    • 不幸的是无法正常工作。回调方法对象没有实现 COM 接口IDispatch。我想我必须在实现 COM 接口IActionCallbackData 的脚本中创建一个自定义类:/
    • @AcidJunkie 您可以将构造函数调用为 IDispatch 类型,而无需额外的接口。给我几个,我会回圈
    猜你喜欢
    • 2011-07-25
    • 2017-08-17
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多