回调到COM对象的Powershell函数

时间:2018-09-26 14:54:15

标签: c++ powershell callback com

很久以前,我创建了一个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函数将是完美的。这样,他们仍然可以使用其日志记录对象等。

1 个答案:

答案 0 :(得分:0)

以您的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)