2011-12-07 6 views
8

मैं एक COM वस्तु Powershell उपयोग कर बनाई गई पर Powershell क्वेरी इंटरफ़ेस कार्य करें:कैसे एक COM वस्तु

$obj = new-object -com MyLib.MyObj 

तब मैं उस वस्तु पर इंटरफेस "MyLib.MyInterface" क्वेरी करने के लिए की जरूरत है, लेकिन मैं कैसे PowerShell के साथ यह करने के लिए पता नहीं है ।

आदेश शब्द में लगता है मुझे नीचे सी ++ कोड

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

किसी भी टिप्पणी के साथ ही काम करते हैं कैसे करते है?

धन्यवाद

उत्तर

2

एक उदाहरण है जहाँ मैं वचन कहते हैं (देखें 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 
+0

अच्छा, यह CoClass बनाने का कोड है। मैं सोच रहा हूं कि वस्तु पर इंटरफेस कैसे क्वेरी करें। आम तौर पर, सी ++ के साथ कोड इस तरह दिखता है: obj-> QueryInterface (ID_MyInterface, और obj2)। सी # कोड के साथ दिखता है: obj2 = obj MyLib.MyInterface के रूप में; लेकिन मुझे नहीं पता कि पावरहेल – Shuping

2

यदि मैं आपकी ज़रूरतों को समझता हूं, तो इसे आजमाएं:

$obj = new-object -com MyLib.MyObj 

$type = $obj.gettype() 

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

आशा एक शुरुआती बिंदु

+0

ईसाई के साथ ऐसा कैसे करें, आपके उत्तर के लिए धन्यवाद! हालांकि, मैंने आपके निर्देशों का पालन करने की कोशिश की लेकिन त्रुटि कह रही है कि ऑब्जेक्ट में GetType – Shuping

+0

नामक विधि नहीं है जो आपका कॉमोबजेक्ट है? आपके नमूना कोड में –

+0

, $ obj मेरा COM ऑब्जेक्ट है। लेकिन मुझे नहीं पता कि इसे अन्य COM इंटरफ़ेस में कैसे डाला जाए (सी ++ कोड: QueryInterface (obj, ....)) – Shuping

2

एक प्रयोग के रूप में मैंने $obj=new-object -com file बनाया। (फाइलमोनिक COM क्लास के लिए "फाइल" प्रोजेड है)। [Runtime.InteropServices.marshal]::GetIUnknownForObject($obj) मुझे मेरी विंडोज 2008R2 मशीन पर System.IntPtr देता है। मैं IMONiker के लिए GUID के साथ [Runtime.InteropServices.marshal] के साथ GUID के साथ उस मान को पार करने में सक्षम था :: QueryInterface और मुझे वही मान वापस मिला (यानी एक ही सूचक) जैसा कि मुझे GetIUnknownForObject से मिला है। तो मैं इंटरफ़ेस से पूछताछ करने में सक्षम था।

हालांकि, मुझे यकीन नहीं है कि पावरहेल से क्या अच्छा है। [Runtime.InteropServices.marshal] में कई अन्य विधियां हैं जो पीएस से COM से निपटने के लिए ब्याज की हो सकती हैं। लेकिन आम तौर पर पीएस में COM ऑब्जेक्ट्स से निपटने में सी ++ में उनके साथ काम करने से बहुत अलग है।

संपादित मैं हाल ही में पाया जाता है और पी एस कि यहां ब्याज की हो सकता है से कुछ COM घटकों पहुंचने का एक तरीका सत्यापित। विंडोज एसडीके आईडीएल फाइलों के एक बड़े सेट के साथ आता है। यदि आप इनमें से किसी एक को एक्सेस करना चाहते हैं (और घटक आईडीस्पैच लागू नहीं करता है), तो आप आईडीएल को एमआईडीएल के साथ संकलित कर सकते हैं और फिर इंटरऑप असेंबली बनाने के लिए टीएलबीआईएमपी का उपयोग कर सकते हैं। मैंने सफलतापूर्वक 3 VSS हार्डवेयर प्रदाता इंटरफेस के साथ ऐसा किया।

मैंने यह भी सीखा है कि आप सीएलएसआईडी से एक प्रकार प्राप्त करने के लिए [type] :: GetTypeFromCLSID का उपयोग कर सकते हैं। और उस घटक के आधार पर आप इसे तुरंत चालू कर सकते हैं।