簡體   English   中英

通過 COM 工作時,如何找出 PowerShell 腳本中的參數類型?

[英]How do I find out the type of parameter in a PowerShell script when working via COM?

我正在編寫一個腳本以在操作系統“Windows 10”中的“Windows PowerShell”5.1 版和“PowerShell”7 版中工作。

我正在使用來自“Windows 窗體”的 class HtmlDocument通過 COM 創建 object:

$dom = New-Object -ComObject "HTMLFile"

我想用這個class的方法write 文檔說它有一個System.String類型參數。 但是將System.String類型的字符串傳遞給方法write不起作用:

$dom = New-Object -ComObject "HTMLFile"
[System.String] $str = "Text"
$dom.write($str)   # Error: type mismatch

我檢查了方法write需要什么類型的參數:

$dom = New-Object -ComObject "HTMLFile"
$dom | Get-Member write

我得到了這個結果:

   TypeName: System.__ComObject#{3050f55f-98b5-11cf-bb82-00aa00bdce0b}

Name  MemberType Definition
----  ---------- ----------
write Method     void write (SAFEARRAY(Variant) psarray)

我讀到SAFEARRAYVariant是 C++ 中使用 COM 時用於編組的結構。 使用這些結構,您可以傳輸任何類型的數組中的數據。 SAFEARRAY是一個數組,除了數據之外,它還存儲有關自身的信息。 Variant是一個數組元素,它可以是不同的類型。

我在“堆棧溢出”上找到了答案jedigoiRon ,從中我很清楚應該字節數組傳遞給write方法:

$dom = New-Object -ComObject "HTMLFile"
[byte[]] $str = 84, 0, 101, 0, 120, 0, 116, 0   # "Text" in encoding UTF-16LE
$dom.write($str)

或同樣的事情:

$dom = New-Object -ComObject "HTMLFile"
$str = [Text.Encoding]::Unicode.GetBytes("Text")   # UTF-16LE
$dom.write($str)

我的問題:人們怎么知道需要將字節數組傳遞給write方法? 這不是從SAFEARRAY(Variant)信息中得出的。 他們猜到了嗎? 他們是否通過不同的類型找到了答案? 有沒有可以在其中找到的文檔?

我需要知道這個問題的答案,因為如果將來我通過 COM 從“PowerShell”工作,那么我可能會遇到更多類似的情況,我需要知道傳遞給組件的變量類型。

TL/DR:您必須在文檔的幫助下知道或猜測。

從技術上講,傳遞 UTF-16 的字節數組並不是文檔所說的,但接收 function 可能會處理多種輸入格式。

如果我們查看IHTMLDocument2::write的文檔,我們會發現它想要

BSTR 的 SAFEARRAY 指定要寫入的文本和 HTML 標記。

該頁面上的示例代碼執行以下操作:

...
SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1); // count is 1
VARIANT *param;
HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)&param);
param->vt = VT_BSTR;
param->bstrVal = bstr; //SysAllocString
hr = SafeArrayUnaccessData(psaStrings);
hr = document->write(psaStrings);

這是一個 SAFEARRAY,在數組中有 1 個條目,一個 VARIANT。 該變體是 BSTR 類型。 BSTR 是一個計數的 WCHAR 數組,但通常可以視為 UTF-16LE 字符串。

當Powershell詢問COM時,關於BSTR的部分已經丟失。 數組項類型可能不是類型庫的一部分。

一些 COM 函數將只接受一個變體類型,而其他函數可能支持多個。 對多個的支持可能會手動編碼為有限的集合,或者它可能會調用VariantChangeType (不太可能)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM