2009-08-30 89 views
0

我有一個COM對象,我試圖從C++(不是.NET)使用,並且所有的示例程序和手冊都是假定使用的C#.NET或VB.NET。 COM對我來說是新的,所以我有點不知所措。我在TLB上使用#import,但我正在努力處理用作參數的變體。我有一個特定的方法,根據文檔和C#.NET中的示例程序,應該返回一個對象[]。然後,我應該將這個數組中的第一個條目轉換爲ControlEvent,然後告訴我如何處理數組中的其餘對象。在C#.NET示例如下:在C#.NET中使用C++中的COM對象返回對象[]

object [] objEvent = (object []) Ctl.GetEvent(); 
ControlEvent ev = (ControlEvent) objEvent[0]; 

在我的情況,GetEvent將返回我一個_variant_t,我需要知道如何將其轉換爲一個Object [],這樣我可以進一步處理。它對我來說並不清楚,即使我用C++表達'對象'。我看到_variant_t文檔向我展示了我可以將變體轉換爲的一百萬個事物,但是他們中沒有一個似乎轉換爲我可以使用的任何東西。我希望有一些幫助將上面的C#.NET代碼轉換爲Visual C++

謝謝。

回答

1

通常,您可以查看變體的vt成員以查看它實際是什麼類型的東西。在這種情況下,我期望它是一個數組,所以你會期望VT_ARRAY中的vartype會有一些變化(通常它與成員類型按位或運算)。然後,您將獲得包含SAFEARRAY實例的parray成員,該成員實際上擁有該數組,並使用常規安全數組函數將數據從數組中取出。

+0

謝謝,我想你已經讓我走上正軌。 VT是VT_ARRAY || VT_VARIANT,我從API調用中返回一個帶有兩個元素的SafeArray,每個元素都是一個VT_I4。然而,兩者的lVal都爲零,所以我仍然堅持我應該如何將這些VT_I4變成指向對象的指針 – bdk 2009-08-30 03:38:22

+0

你可以顯示你用來檢索'SAFEARRAY'元素並獲得'VT_I4'的代碼嗎? – 2009-08-30 03:56:18

+0

_variant_t v = m_pCtl-> getNextEvent() printf(「Variant Type is%x \ n」,v.vt); [打印0x200c]] _variant_t項 LONG IDX = 0 HRESULT HR = SafeArrayGetElement(v.parray,&IDX,和項目) 如果(小時== S_OK) 的printf( 「元素類型是:%d \ n」 個, item.vt); [[打印3]] – bdk 2009-08-30 04:12:20

1

我沒有這樣做,而是從閱讀的_variant_t類的文檔(以下管教我原來的職位的評論),我想你應該閱讀_variant_t實例(實際上是VARTYPE vt領域的vtVARIANT實例:_variant_t實例直接從VARIANT派生)來查看它包含的是什麼類型的東西,如VARIANT結構的參考文檔中所述。你知道變體中包含什麼類型的東西,使用相應的類型特定的操作符來讀取它。

如果您嘗試在不理解的情況下使用COM,那麼您將會受到一些傷害(並且您可能需要一本描述該書的書);例如,您可能需要了解接口012和AddRef方法。

+0

除非需要將整個實例傳遞給某個外部接口,否則不要從_variant_t包裝器中分離VARIANT實例。 _variant_t是一個智能的包裝類,它可以作爲底層實例或多或少的處理。 – 2009-08-30 03:03:05

+0

如何讀取VARIANT的vt字段值(不分離VARIANT)?我沒有在文檔中看到_variant_t方法返回VARTYPE。 – ChrisW 2009-08-30 03:09:36

+0

你做了instance.vt - _variant_t實例直接從VARIANT派生 – 2009-08-30 03:11:45