很久以前我创建了一个 COM 类,它做一些事情并提供回调注册:
HRESULT RegisterCallback([in] IUnknown* callbackFunction);
callbackFunction
可以是 IDispatch
或 ICallbackHandler
类型
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 函数将是完美的。这样,他们仍然可以使用他们的日志记录对象等。
最佳答案
以你的 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
驱动器以获取脚本 block 定义:
function ProgressCallback
{
param($data)
$data.Message
}
$obj.RegisterCallback($Function:ProgressCallback)
关于c++ - 回调到 COM 对象的 powershell 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52520664/