2014-04-25 108 views
0

我有我正在使用的第三方COM對象。大多數很好,但我堅持讀對象的GUID屬性。使用C++ Builder從COM對象中讀取GUID屬性

自動生成的成分包裝/頭的相關部分看起來是這樣的:

// *********************************************************************// 
// DispIntf: IFoo 
// Flags:  (4416) Dual OleAutomation Dispatchable 
// GUID:  {5DE5DAAF-5419-4B2B-9771-58EAEE780799} 
// *********************************************************************// 
template<class T> 
class IFooDispT : public TAutoDriver<IFoo> 
{ 
    ... 
BSTR __fastcall get_FileName(void); 
HRESULT __fastcall get_ProjectGUID(/*AUTO_PARAM_ERROR(System::TGUID* Value)*/ VARIANT* Value); 
HRESULT __fastcall get_ProjectName(BSTR* Value/*[out,retval]*/); 

__property BSTR FileName = {read = get_FileName}; 
__property BSTR ProjectName = {read = get_ProjectName}; 

注意ProjectGUID屬性如何被標記AUTO_PARAM_ERROR,它不會出現在屬性列表。

我試圖直接通過get_ProjectGUID()來讀取它,但它總是返回HRESULT = 0x80070057 (E_INVALID_ARGS)

從OLEVIEW調度接口的IDL看起來像這樣: -

[ 
    uuid(5DE5DAAF-5419-4B2B-9771-58EAEE780799), 
    version(1.0), 
    helpstring("Dispatch interface for xpCOMFoo Object"), 
    dual 
] 
dispinterface IFoo { 
    properties: 
    methods: 
<...snipped...> 
     [id(0x000000cf), propget] 
     BSTR FileName(); 
     [id(0x000000d0), propget] 
     GUID ProjectGUID(); 
     [id(0x000000d1), propget] 
     BSTR ProjectName(); 
}; 

我(雖然沒有使用上面顯示的後期綁定)測試德爾福同一個對象,我很高興的是, COM對象本身沒有錯。

+0

,你能否告訴TLB中的IDL與OLEVIEW相關部分? – Noseratio

+0

@Noseratio完成。 – Roddy

+2

COM對象本身有問題。 * dispinterface *的方法需要使用IDispatch :: Invoke()進行調用。這要求方法的參數和返回值可以存儲在VARIANT中。您不能在VARIANT中存儲GUID。它實際上不是調度接口,它具有[雙重]屬性。您只能早期調用該方法。 –

回答

0

嘗試調用它像這樣:

TAutoDriver<IFoo> foo; 

// ... 

GUID guid; 
memset(&guid, 0, sizeof(guid)); 
// use -> to access the raw dual interface 
HRESULT hr = foo->get_ProjectGUID(&guid);