TComponent::Invoke - C++ Builder

C++ Builder 参考手册 ➙ TComponent ➙ Invoke


头文件:#include
命名空间:System::Classes
类:TComponent
访问权限:protected:
函数原型:

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 的成员函数,如果这个组件封装了 COM 对象,Invoke 可以访问 COM 对象的属性和调用 COM 对象的方法。

参数:

  • DispID:属性、方法和参数的 ID,需要使用 GetIDsOfNames 方法获取;
  • IID:预留参数,必须是 IID_NULL;
  • LocaleID 区域和语言的 ID,可以用 GetThreadLocale 获取;
  • Flags:调用的类型:
    DISPATCH_METHOD:调用方法;
    DISPATCH_PROPERTYGET:读属性;
    DISPATCH_PROPERTYPUT:写属性;
    DISPATCH_PROPERTYPUTREF:写属性,通过传引用而不是传值;
  • pParams:实际上是 DISPPARAMS * 类型的,调用函数的参数;
  • pVarResult:实际上是 VARIANT * 类型的,函数的返回值,没有返回值可以用 NULL;
  • pExcepInfo:实际上是 EXCEPINFO * 类型的,如果 Invoke 返回值是 DISP_E_EXCEPTION,这个参数返回执行异常,不需要可以用 NULL;
  • pArgErr:实际上是 unsigned int * 类型的,如果参数有错误,Invoke
    的返回值是 DISP_E_TYPEMISMATCH 或 DISP_E_PARAMNOTFOUND,这个参数返回第一个出错的参数的序号,如果不需要可以用 NULL。

返回值:

返回值 说明
S_OK 成功
DISP_E_BADPARAMCOUNT 提供的 DISPPARAMS 里面包含的参数个数不对
DISP_E_BADVARTYPE DISPPARAMS 的 rgvarg 包含不正确的 variant 类型的参数
DISP_E_EXCEPTION 执行过程中产生了异常,异常通过填写参数 pExcepInfo 来返回
DISP_E_MEMBERNOTFOUND 成员 (属性或方法) 未找到,或者写只读属性引起的错误
DISP_E_NONAMEDARGS 这个 IDispatch 不支持命名的参数
DISP_E_OVERFLOW DISPPARAMS 的 rgvarg 包含无法强制转换到指定类型的参数
DISP_E_PARAMNOTFOUND 期望的参数未找到,通过 pArgErr 返回第一个出错的参数序号
DISP_E_TYPEMISMATCH 参数的类型错误,通过 pArgErr 返回第一个出错的参数的序号
DISP_E_UNKNOWNINTERFACE IID 参数出错,这个参数必须是 IID_NULL
DISP_E_UNKNOWNLCID 包含字符串参数,并且 LocaleID 表示的区域和语言无法识别
DISP_E_PARAMNOTOPTIONAL 遗漏了必需的参数
  • 如果这个组件封装了 COM 对象,Invoke 提供访问 COM 对象的属性和调用 COM 对象的方法。
  • 如果组件封装的是 IDispatch 接口,Invoke 会调用 IDispatch 的 Invoke 方法,并且把参数传递给 IDispatch 的 Invoke 方法;
  • 参数所需的 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 架构
  • VCL 类继承关系

C++ Builder 参考手册 ➙ TComponent ➙ Invoke

你可能感兴趣的:(TComponent::Invoke - C++ Builder)