Powershell如何在COM对象上查询接口

时间:2011-12-07 02:59:02

标签: com powershell queryinterface

我使用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执行相同的工作

有任何意见吗?

由于

3 个答案:

答案 0 :(得分:2)

以下是我调用Word(请参阅Word Object Model Overview)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

答案 1 :(得分:2)

如果我了解您的需求,请尝试以下方法:

$obj = new-object -com MyLib.MyObj

$type = $obj.gettype()

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

希望可以成为一个起点

答案 2 :(得分:2)

作为实验,我创建了$obj=new-object -com file。 (“file”是FileMoniker COM类的progid)。 [Runtime.InteropServices.marshal]::GetIUnknownForObject($obj)在我的Windows 2008R2计算机上为我提供了System.IntPtr。我能够将该值以及IMoniker的GUID传递给[Runtime.InteropServices.marshal] :: QueryInterface,并且我得到了与GetIUnknownForObject相同的值(即相同的指针)。所以我能够查询界面。

但是,我不确定Powershell会有什么好处。 [Runtime.InteropServices.marshal]中有很多其他方法可能对从PS处理COM感兴趣。但总的来说,在PS中处理COM对象与在C ++中处理它们是非常不同的。

<强> 修改 我最近发现并验证了一种从PS访问某些 COM组件的方法,这些组件可能会引起我们的兴趣。 Windows SDK附带了大量IDL文件。如果要访问其中一个(并且组件未实现IDispatch),可以使用MIDL编译IDL,然后使用TLBIMP创建互操作程序集。我使用3个VSS硬件提供程序接口成功完成了此操作。

我还了解到您可以使用[type] :: GetTypeFromCLSID从CLSID获取类型。然后根据组件,您可以实例化它。