CoInitialize(NULL);
//
DISPID dispid;
OLECHAR *func = L"testocx";//activex导出的方法
DISPPARAMS dispparams = {NULL, NULL, 0, 0};
HRESULT hResult;
CLSID clsid;
UuidFromString((unsigned char*)"4FCAE43F-9212-4ECE-A804-D25D792CCEE1", &clsid);
//得到IDispatch接口指针
IDispatch* pIDispatch = NULL;
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;
}
printf("\n successful \n");
end:
CoUninitialize();
//
DISPID dispid;
OLECHAR *func = L"testocx";//activex导出的方法
DISPPARAMS dispparams = {NULL, NULL, 0, 0};
HRESULT hResult;
CLSID clsid;
UuidFromString((unsigned char*)"4FCAE43F-9212-4ECE-A804-D25D792CCEE1", &clsid);
//得到IDispatch接口指针
IDispatch* pIDispatch = NULL;
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;
}
printf("\n successful \n");
end:
CoUninitialize();
For example: // Set up the parameters
DISPPARAMS dispparms;
memset( &dispparms, 0, sizeof( DISPPARAMS ));
dispparms.cArgs = 2; // allocate memory for parameters
VARIANTARG* pArg = new VARIANTARG[dispparms.cArgs];
dispparms.rgvarg = pArg;
memset(pArg, 0, sizeof(VARIANT) * dispparms.cArgs); // The parameters are entered right to left
// We are adding 123 to 456
dispparms.rgvarg[0].vt = VT_I4;
dispparms.rgvarg[0].lVal = 123;
dispparms.rgvarg[1].vt = VT_I4;
dispparms.rgvarg[1].lVal = 456; // This method returns a value so we need a VARIANT to store it in
VARIANTARG vaResult;
VariantInit( &vaResult ); // Invoke the method in the local server
hr = pDispatch->Invoke( dispid,
IID_NULL,
LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD,
&dispparms,
&vaResult,
0,
NULL );
我初始化了
DISPPARAMS dispparams = {NULL, NULL, 0, 0};
//
// MessageText:
//
// Catastrophic failure
//
#define E_UNEXPECTED _HRESULT_TYPEDEF_(0x8000FFFFL)如果把CoInitialize, 改为OleInitialize试试呢 相应CoUninitialize()也要改为OleUninitialize(), 另外你的testocx的方法没有参数和返回值吧, 函数里面做什么了?
{
::MessageBox(NULL,"","",MB_OK);}
CComVariant vResult;
pIDispatch-> Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, &vResult, NULL, NULL); 如果是你自己的控件,跟踪进去看看就知道原因了。
{
return TRUE;
}
佩服!!!!!!!!!!
有谁知道假设 这个控件不支持IsInvokeAllowed 怎样调用?