Shu*_*ing 9 com powershell queryinterface
我使用Powershell创建了一个COM对象:
$obj = new-object -com MyLib.MyObj
Run Code Online (Sandbox Code Playgroud)
然后我需要查询该"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?
Run Code Online (Sandbox Code Playgroud)
我如何使用Powershell完成同样的工作
任何意见?
谢谢
作为一个实验,我创建了$obj=new-object -com file. (“file”是 FileMoniker COM 类的 progid)。[Runtime.InteropServices.marshal]::GetIUnknownForObject($obj)给我一个System.IntPtr在我的 Windows 2008R2 机器上的。我能够将该值以及 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 Hardware Provider 接口成功地做到了这一点。
我还了解到您可以使用 [type]::GetTypeFromCLSID 从 CLSID 获取类型。然后根据组件,您可以实例化它。
下面是我调用 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")
Run Code Online (Sandbox Code Playgroud)
要查看 COM 对象的属性和方法,您可以使用:
$obj | Get-Member
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5155 次 |
| 最近记录: |