You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell动态调用Win32API:如何将数组展开为独立函数参数?

如何在PowerShell中将数组展开为函数的独立参数?

你需要实现的是动态将参数数组拆分为Delegate.Invoke()的独立参数,在PowerShell中可以通过数组拆分运算符@(即splatting特性)实现,以下是具体解决方案:

核心修正点

将代码中无法工作的调用:

$Delegate.Invoke($Arguments)

修改为:

$Delegate.Invoke(@$Arguments)

原理说明

PowerShell中直接传递数组给多参数方法时,会把整个数组当作单个参数传入;而使用@$Arguments(或$Arguments@,两种写法等效)会将数组的每个元素拆分为独立参数,一一对应到方法的参数位置上,完全匹配你需要的动态传参场景。

修正后的完整代码片段

function CallWin32API(
    [String] $ModuleName,
    [String]$FunctionName,
    [array]$Arguments,
    [Type]$ReturnType=[Void]
) {
    $Prototype = @()
    foreach ($Argument in $Arguments) {
        $Prototype += $Argument.GetType()
    }

    # ...
    # 此处省略获取函数地址、创建委托类型的逻辑
    # ...

    $Delegate = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($FunctionAddr, $DelegateType)

    # 使用数组拆分运算符展开参数数组
    $result = $Delegate.Invoke(@$Arguments)
    
    return $result
}

# 调用示例
CallWin32API user32.dll MessageBoxA @([IntPtr]::Zero,"Hello World","This is My MessageBox",0) ([int])

额外注意事项

  • 确保$Arguments数组中每个元素的类型与目标Win32API的参数类型严格匹配,比如MessageBoxA的第四个参数是uint32类型,建议传递[uint32]0而非默认的int类型0,避免潜在的类型不兼容问题。
  • 动态生成委托类型时,$Prototype的类型顺序必须完全对应Win32API的参数顺序,否则会导致调用失败。

内容的提问来源于stack exchange,提问作者Tom Stock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:52:46