2011-12-07 5 views
8

Tôi tạo ra một đối tượng COM sử dụng Powershell:Làm thế nào để giao diện truy vấn Powershell trên một đối tượng COM

$obj = new-object -com MyLib.MyObj 

Sau đó, tôi cần phải truy vấn giao diện "MyLib.MyInterface" trên đối tượng đó, nhưng tôi không có ý tưởng làm thế nào để làm điều đó với PowerShell .

Trong thứ tự từ cho rằng tôi có dưới 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? 

Làm thế nào để thực hiện công việc tương tự với Powershell

Bất kỳ ý kiến?

Cảm ơn

Trả lời

2

Dưới đây là một ví dụ mà tôi gọi Lời (xem Word Object Model Overview) COM đối tượng:

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

Để xem các thuộc tính và phương pháp của đối tượng COM của bạn, bạn có thể sử dụng:

$obj | Get-Member 
+0

Vâng, đây là mã tạo một CoClass. Tôi tự hỏi làm thế nào để truy vấn các giao diện trên đối tượng. Thông thường, với mã C++ giống như: obj-> QueryInterface (ID_MyInterface, & obj2). Với mã C# trông giống như: obj2 = obj như MyLib.MyInterface; Nhưng tôi không có ý tưởng làm thế nào để làm điều này với Powershell – Shuping

2

Nếu tôi hiểu nhu cầu của bạn, hãy thử điều này:

$obj = new-object -com MyLib.MyObj 

$type = $obj.gettype() 

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

hy vọng có thể là điểm khởi đầu

+0

Christian, cảm ơn câu trả lời của bạn! Tuy nhiên, tôi đã cố gắng làm theo hướng dẫn của bạn nhưng nhận được lỗi nói rằng đối tượng không chứa một phương thức có tên GetType – Shuping

+0

đó là comobject của bạn? –

+0

trong mã mẫu của bạn, $ obj là đối tượng COM của tôi. nhưng tôi không biết làm thế nào để đúc nó vào giao diện COM khác (c + + code: QueryInterface (obj, ....)) – Shuping

2

Là thử nghiệm tôi đã tạo $obj=new-object -com file. ("tập tin" là progid cho lớp COM FileMoniker). [Runtime.InteropServices.marshal]::GetIUnknownForObject($obj) cấp cho tôi số System.IntPtr trên máy tính Windows 2008R2 của tôi. Tôi đã có thể vượt qua giá trị đó, cùng với GUID cho IMoniker [Runtime.InteropServices.marshal] :: QueryInterface và tôi đã lấy lại cùng một giá trị (tức là cùng một con trỏ) như tôi nhận được từ GetIUnknownForObject. Vì vậy, tôi đã có thể truy vấn giao diện.

Tuy nhiên, tôi không chắc những gì tốt từ Powershell. Có rất nhiều phương thức khác trong [Runtime.InteropServices.marshal] có thể quan tâm đến việc xử lý COM từ PS. Nhưng nói chung đối phó với các đối tượng COM trong PS là rất khác so với đối phó với chúng trong C + +.

EDIT Gần đây tôi đã tìm thấy và xác minh một cách để truy cập vào một số thành phần COM từ PS mà có thể quan tâm ở đây. Windows SDK đi kèm với một tập hợp lớn các tệp IDL. Nếu bạn muốn truy cập vào một trong các thành phần này (và thành phần không thực hiện IDispatch), bạn có thể biên dịch IDL với MIDL và sau đó sử dụng TLBIMP để tạo ra một hội đồng interop. Tôi đã thực hiện thành công việc này với 3 giao diện Nhà cung cấp phần cứng VSS.

Tôi cũng biết rằng bạn có thể sử dụng [loại] :: GetTypeFromCLSID để nhận loại từ CLSID. Và tùy thuộc vào thành phần bạn có thể khởi tạo nó.