描述:
CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
//
DISPID dispid;
OLECHAR *func = L"testocx";
DISPPARAMS dispparams;
IDispatch* pIDispatch = NULL;
// memset( &dispparams, 0, sizeof( DISPPARAMS ));
dispparams.cArgs = 0;
dispparams.cNamedArgs = 0;
dispparams.rgdispidNamedArgs = NULL;
dispparams.rgvarg = NULL;
HRESULT hResult;
CLSID clsid;
wchar_t progid[] = L"OCXTEST.OcxtestCtrl.1";
if (FAILED(::CLSIDFromProgID(progid, &clsid)))
{
goto end;
}
// UuidFromString((unsigned char*)"4FCAE43F-9212-4ECE-A804-D25D792CCEE1", &clsid);
//得到IDispatch接口指针
if (FAILED(::CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void**)&pIDispatch)))
{
goto end;
}
// 得到DISPID
if (FAILED(pIDispatch->GetIDsOfNames(IID_NULL, &func, 1, LOCALE_USER_DEFAULT, &dispid)))
{
goto end;
}
// 通过DISPID使用方法
hResult = pIDispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
if (FAILED(hResult))
{
printf("\nhResult = %x\n",hResult);
goto end;
}
在上面例子中Ocxtest控件是我自己开发的,我知道testocx函数的参数数量为0,但如果activex控件是别人开发的,我们怎么才能知道导出函数的参数数量?然后可以使用Invoke调用
解决方案1:
MK
解决方案2:解决方案3:
CComPtr<ITypeInfo> spTypeInfo;
hr = spDispatch->GetTypeInfo(0, 0, &spTypeInfo);
TYPEATTR* pTypeAttr = NULL;
hr = spTypeInfo->GetTypeAttr(&pTypeAttr);
for(USHORT i=0; i<pTypeAttr->cFuncs; i++)
{
FUNCDESC* pFuncDesc = NULL;
spTypeInfo->GetFuncDesc((UINT)i, &pFuncDesc);
for (SHORT j=0; j<pFuncDesc->cParams; j++)
{
pFuncDesc->lprgelemdescParam[j]; // 这个结构中就是参数的类型信息,自己查资料去吧。
}
}
通过LoadTypeLib获取ITypeLib接口,
通过ITypeLib::GetTypeInfo获取ITypeInfo接口,
调用ITypeInfo::GetFuncDesc获取FUNCDESC
使用 “ActiveX Contrel Test Container" 将目标控件载入,
在 C />
导入类型库。
类型库中有你所需要的调用信息。
#import "filename.ocx"