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對象本身沒有錯。
,你能否告訴TLB中的IDL與OLEVIEW相關部分? – Noseratio
@Noseratio完成。 – Roddy
COM對象本身有問題。 * dispinterface *的方法需要使用IDispatch :: Invoke()進行調用。這要求方法的參數和返回值可以存儲在VARIANT中。您不能在VARIANT中存儲GUID。它實際上不是調度接口,它具有[雙重]屬性。您只能早期調用該方法。 –