9

Powershell を使用して COM オブジェクトを作成しました。

$obj = new-object -com MyLib.MyObj

次に、そのオブジェクトのインターフェイス"MyLib.MyInterface"にクエリを実行する必要がありますが、PowerShell でそれを行う方法がわかりません。

順番に、以下の C++ コードがあるとします。

CComPtr<IInterface1> pInterface1;
CComPtr<IInterface2> pInterface2;
pInterface1->CoCreateInstance(CLSID_XXXX);   //in PowerShell: $obj = new-object -com MyLib.MyObj
pInterface1->QueryInterface(IID_YYYY, &pInterface2); //how to do this in PowerShell?

Powershell で同じ作業を行うにはどうすればよいですか

コメントはありますか?

ありがとう

4

3 に答える 3

4

実験として作成しまし$obj=new-object -com fileた。(「ファイル」は、FileMoniker COM クラスのプログラム ID です)。[Runtime.InteropServices.marshal]::GetIUnknownForObject($obj)Windows 2008R2System.IntPtrマシンで IMoniker の GUID とともに [Runtime.InteropServices.marshal]::QueryInterface にその値を渡すことができ、GetIUnknownForObject から取得したのと同じ値 (つまり、同じポインター) を取得しました。それで、インターフェースを照会することができました。

ただし、それが Powershell からどのようなメリットがあるかはわかりません。[Runtime.InteropServices.marshal] には、PS から COM を処理するのに役立つメソッドが他にもたくさんあります。しかし、一般に、PS での COM オブジェクトの扱いは、C++ での扱いとは大きく異なります。

編集私は最近、ここで興味深いかもしれない PS からいくつかのCOM コンポーネント にアクセスする方法を見つけて検証しましWindows SDK には、多数の IDL ファイルが付属しています。これらのいずれかにアクセスする必要がある場合 (およびコンポーネントが IDispatch を実装していない場合)、IDL を MIDL でコンパイルし、TLBIMP を使用して相互運用アセンブリを作成できます。私は 3 つの VSS ハードウェア プロバイダー インターフェイスでこれを成功させました。

また、[type]::GetTypeFromCLSID を使用して CLSID から型を取得できることも学びました。コンポーネントによっては、インスタンス化できます。

于 2015-09-24T20:47:23.423 に答える
3

あなたのニーズを理解したら、これを試してください:

$obj = new-object -com MyLib.MyObj

$type = $obj.gettype()

$type.GetInterfaces() # give a list of interfaces for the type

希望は出発点になることができます

于 2011-12-07T08:27:29.500 に答える
2

これは、Wordを呼び出す例です(Wordオブジェクトモデルの概要を参照)。COMオブジェクト:

# Create Word Object  
$wrd = new-object -com "word.application"

# Make Word Visible  
$wrd.visible = $true

# Open a document   
$doc = $wrd.documents.open("C:\silogix\silogix.doc")

COMオブジェクトのプロパティとメソッドを表示するには、次を使用できます。

$obj | Get-Member
于 2011-12-07T04:38:25.090 に答える