2011-12-07 16 views
8

creé un objeto COM utilizando PowerShell:Cómo hacer interfaz de consulta PowerShell en un objeto COM

$obj = new-object -com MyLib.MyObj 

Entonces necesito para consultar la interfaz "MyLib.MyInterface" en ese objeto, pero no tengo ni idea de cómo hacerlo con PowerShell .

En orden de las palabras supongamos que tengo el siguiente código 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? 

¿Cómo puedo hacer el mismo trabajo con Powershell

Cualquier comentario?

Gracias

Respuesta

2

He aquí un ejemplo en el que yo llamo Palabra (ver Word Object Model Overview) COM objeto:

# 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") 

Para ver propiedades y métodos de su objeto COM que puede utilizar:

$obj | Get-Member 
+0

Bueno, este es el código de creación de una CoClass. Me pregunto cómo consultar las interfaces en el objeto. Normalmente, con C++ el código se ve así: obj-> QueryInterface (ID_MyInterface, y obj2). Con C# el código se ve así: obj2 = obj como MyLib.MyInterface; Pero no tengo idea de cómo hacer esto con Powershell – Shuping

2

Si entendí sus necesidades, intente esto:

$obj = new-object -com MyLib.MyObj 

$type = $obj.gettype() 

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

espero que pueda ser un punto de partida

+0

Christian, ¡gracias por tu respuesta! sin embargo, traté de seguir sus instrucciones pero recibo el error que dice que el objeto no contiene un método llamado GetType – Shuping

+0

, ¿cuál es su objeto? –

+0

en su código de muestra, $ obj es mi objeto COM. pero no sé cómo convertirlo a otra interfaz COM (código de C++: QueryInterface (obj, ....)) – Shuping

2

Como experimento, creé $obj=new-object -com file. ("archivo" es la progid para la clase COM de FileMoniker). [Runtime.InteropServices.marshal]::GetIUnknownForObject($obj) me da un System.IntPtr en mi máquina Windows 2008R2. Pude pasar ese valor, junto con el GUID para IMoniker a [Runtime.InteropServices.marshal] :: QueryInterface y obtuve el mismo valor (es decir, el mismo puntero) que obtuve de GetIUnknownForObject. Así que pude consultar la interfaz.

Sin embargo, no estoy seguro de lo bien que hace de Powershell. Hay muchos otros métodos en [Runtime.InteropServices.marshal] que pueden ser de interés para manejar COM desde PS. Pero, en general, tratar con objetos COM en PS es muy diferente a tratar con ellos en C++.

EDITAR recientemente he encontrado y verificado una forma de acceder a algunos componentes COM de PS que podrían ser de interés aquí. El SDK de Windows viene con un gran conjunto de archivos IDL. Si desea acceder a uno de estos (y el componente no implementa IDispatch), puede compilar el IDL con MIDL y luego usar TLBIMP para crear un ensamblado de interoperabilidad. Hice esto con éxito con las 3 interfaces de VSS Hardware Provider.

También me enteré de que puede usar [type] :: GetTypeFromCLSID para obtener un tipo de un CLSID. Y dependiendo del componente, puedes crear una instancia.

Cuestiones relacionadas