C++ Builder 參考手冊 ? TComponent ? Invoke
頭文件:#include <System.Classes.hpp>
命名空間:System::Classes
類:TComponent
訪問權(quán)限:protected:
函數(shù)原型:
HRESULT __stdcall Invoke(
int DispID,
const GUID &IID,
int LocaleID,
System::Word Flags,
void *pParams,
void *pVarResult,
void *pExcepInfo,
void *pArgErr);
System::Classes::TComponent::Invoke 是 System::Classes::TComponent 的成員函數(shù)捏卓,如果這個組件封裝了 COM 對象,Invoke 可以訪問 COM 對象的屬性和調(diào)用 COM 對象的方法梯啤。
參數(shù):
- DispID:屬性、方法和參數(shù)的 ID赂毯,需要使用 GetIDsOfNames 方法獲群薇贰;
- IID:預(yù)留參數(shù)澡腾,必須是 IID_NULL敞映;
- LocaleID 區(qū)域和語言的 ID较曼,可以用 GetThreadLocale 獲取振愿;
- Flags:調(diào)用的類型:
DISPATCH_METHOD:調(diào)用方法捷犹;
DISPATCH_PROPERTYGET:讀屬性弛饭;
DISPATCH_PROPERTYPUT:寫屬性;
DISPATCH_PROPERTYPUTREF:寫屬性萍歉,通過傳引用而不是傳值侣颂; - pParams:實際上是 DISPPARAMS * 類型的,調(diào)用函數(shù)的參數(shù)枪孩;
- pVarResult:實際上是 VARIANT * 類型的憔晒,函數(shù)的返回值,沒有返回值可以用 NULL蔑舞;
- pExcepInfo:實際上是 EXCEPINFO * 類型的拒担,如果 Invoke 返回值是 DISP_E_EXCEPTION,這個參數(shù)返回執(zhí)行異常攻询,不需要可以用 NULL从撼;
- pArgErr:實際上是 unsigned int * 類型的,如果參數(shù)有錯誤钧栖,Invoke
的返回值是 DISP_E_TYPEMISMATCH 或 DISP_E_PARAMNOTFOUND低零,這個參數(shù)返回第一個出錯的參數(shù)的序號,如果不需要可以用 NULL拯杠。
返回值:
返回值 | 說明 |
---|---|
S_OK | 成功 |
DISP_E_BADPARAMCOUNT | 提供的 DISPPARAMS 里面包含的參數(shù)個數(shù)不對 |
DISP_E_BADVARTYPE | DISPPARAMS 的 rgvarg 包含不正確的 variant 類型的參數(shù) |
DISP_E_EXCEPTION | 執(zhí)行過程中產(chǎn)生了異常掏婶,異常通過填寫參數(shù) pExcepInfo 來返回 |
DISP_E_MEMBERNOTFOUND | 成員 (屬性或方法) 未找到,或者寫只讀屬性引起的錯誤 |
DISP_E_NONAMEDARGS | 這個 IDispatch 不支持命名的參數(shù) |
DISP_E_OVERFLOW | DISPPARAMS 的 rgvarg 包含無法強(qiáng)制轉(zhuǎn)換到指定類型的參數(shù) |
DISP_E_PARAMNOTFOUND | 期望的參數(shù)未找到潭陪,通過 pArgErr 返回第一個出錯的參數(shù)序號 |
DISP_E_TYPEMISMATCH | 參數(shù)的類型錯誤气堕,通過 pArgErr 返回第一個出錯的參數(shù)的序號 |
DISP_E_UNKNOWNINTERFACE | IID 參數(shù)出錯,這個參數(shù)必須是 IID_NULL |
DISP_E_UNKNOWNLCID | 包含字符串參數(shù)畔咧,并且 LocaleID 表示的區(qū)域和語言無法識別 |
DISP_E_PARAMNOTOPTIONAL | 遺漏了必需的參數(shù) |
- 如果這個組件封裝了 COM 對象,Invoke 提供訪問 COM 對象的屬性和調(diào)用 COM 對象的方法揖膜。
- 如果組件封裝的是 IDispatch 接口誓沸,Invoke 會調(diào)用 IDispatch 的 Invoke 方法,并且把參數(shù)傳遞給 IDispatch 的 Invoke 方法壹粟;
- 參數(shù)所需的 DISPID 需要使用 GetIDsOfNames 方法獲取拜隧。
例:
LPCWSTR name = L"FuncName";
LCID lcid = GetThreadLocale();
DISPID dispid;
HRESULT hr = GetIDsOfNames(IID_NULL, (LPWSTR*)(&name), 1, lcid, &dispid);
System::Win::Comobj::OleCheck(hr);
WORD wFlags = DISPATCH_METHOD;
DISPPARAMS params;
::ZeroMemory(¶ms, sizeof(params));
VARIANT retVal;
::VariantInit(&retVal);
EXCEPINFO ExcepInfo;
::ZeroMemory(&ExcepInfo, sizeof(ExcepInfo));
UINT ErrArg = 0;
hr = Invoke(dispid, IID_NULL, lcid, wFlags, ¶ms, &retVal, &ExcepInfo, &ErrArg);
if(hr == S_OK)
參考:
- System::Classes::TComponent::GetIDsOfNames
- System::Classes::TComponent::BeginInvoke
- System::Classes::TComponent::EndInvoke
- System::Classes::TComponent::EndFunctionInvoke
- System::Classes::TComponent::GetTypeInfo
- System::Classes::TComponent::GetTypeInfoCount
- System::Classes::TComponent
- System::Classes::TPersistent
- System::TObject
- PME 架構(gòu)
- VCL 類繼承關(guān)系
C++ Builder 參考手冊 ? TComponent ? Invoke