2011-12-07 15 views
8

ho creato un oggetto COM utilizzando PowerShell:Come interfaccia di interrogazione PowerShell in un oggetto COM

$obj = new-object -com MyLib.MyObj 

Poi ho bisogno di interrogare l'interfaccia "MyLib.MyInterface" su tale oggetto, ma non ho idea di come farlo con PowerShell .

Al parola fine supponiamo di avere il codice qui sotto 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? 

Come faccio a fare lo stesso lavoro con PowerShell

Eventuali commenti?

Grazie

risposta

2

Ecco un esempio in cui io chiamo Word (vedi Word Object Model Overview) oggetto 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") 

Per visualizzare le proprietà ei metodi del vostro oggetto COM è possibile utilizzare:

$obj | Get-Member 
+0

Bene, questo è il codice di creazione di un CoClass. Mi chiedo come interrogare le interfacce sull'oggetto. Normalmente, con C++ il codice è simile a: obj-> QueryInterface (ID_MyInterface, & obj2). Con C# il codice appare come: obj2 = obj come MyLib.MyInterface; Ma non ho idea di come farlo con Powershell – Shuping

2

Se ho compreso le tue esigenze, prova questo:

$obj = new-object -com MyLib.MyObj 

$type = $obj.gettype() 

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

speranza può essere un punto di partenza

+0

Christian, grazie per la tua risposta! tuttavia, ho provato a seguire le tue istruzioni ma ho ricevuto l'errore dicendo che l'oggetto non contiene un metodo denominato GetType – Shuping

+0

che è il tuo oggetto? –

+0

nel codice di esempio, $ obj è il mio oggetto COM. ma non so come lanciarlo su un'altra interfaccia COM (codice C++: QueryInterface (obj, ....)) – Shuping

2

Come esperimento ho creato $obj=new-object -com file. ("file" è il progid per la classe COM FileMoniker). [Runtime.InteropServices.marshal]::GetIUnknownForObject($obj) mi dà un System.IntPtr sul mio computer Windows 2008R2. Sono stato in grado di passare quel valore, insieme al GUID per IMoniker a [Runtime.InteropServices.marshal] :: QueryInterface e ho ottenuto lo stesso valore (cioè lo stesso puntatore) ottenuto da GetIUnnaptorObject. Quindi sono stato in grado di interrogare l'interfaccia.

Tuttavia, non sono sicuro di quale sia il valore di Powershell. Esistono molti altri metodi in [Runtime.InteropServices.marshal] che potrebbero essere di interesse per gestire COM da PS. In generale, la gestione degli oggetti COM in PS è molto diversa rispetto a quella in C++.

EDIT Recentemente ho trovato e verificato un modo per accedere alcuni componenti COM da PS che potrebbero essere di interesse qui. Windows SDK è dotato di un ampio set di file IDL. Se si desidera accedere a uno di questi (e il componente non implementa IDispatch), è possibile compilare l'IDL con MIDL e quindi utilizzare TLBIMP per creare un assembly di interoperabilità. L'ho fatto con successo con le 3 interfacce VSS Hardware Provider.

Ho anche imparato che è possibile utilizzare [tipo] :: GetTypeFromCLSID per ottenere un tipo da un CLSID. E a seconda del componente è possibile quindi istanziarlo.

Problemi correlati