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();

解决方案 »

  1.   

    当然失败了,你的参数,dispparams就根本没有Initialize。Invoke当然失败了。
      

  2.   

    you need do as following.
    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 );
      

  3.   

    toxyboy:
    我初始化了
    DISPPARAMS   dispparams   =   {NULL,   NULL,   0,   0}; 
      

  4.   

    hResult   =   pIDispatch-> Invoke(dispid,   IID_NULL,   LOCALE_USER_DEFAULT,   DISPATCH_METHOD,   &dispparams,   NULL,   NULL,   NULL);//失败错误代码0x8000ffff 
      

  5.   

    最怕遇见这种错误了, 一点提示都没有, Catastrophic灾难性错误// MessageId: E_UNEXPECTED
    //
    // MessageText:
    //
    //  Catastrophic failure
    //
    #define E_UNEXPECTED                     _HRESULT_TYPEDEF_(0x8000FFFFL)如果把CoInitialize, 改为OleInitialize试试呢 相应CoUninitialize()也要改为OleUninitialize(), 另外你的testocx的方法没有参数和返回值吧, 函数里面做什么了?
      

  6.   

    使用CoInitializeEx,换一下其中的参数, 感觉是线程模型的错误
      

  7.   

    void COcxtestCtrl::testocx() 
    {
       ::MessageBox(NULL,"","",MB_OK);}
      

  8.   

    具体出错原因需要看组件接口的具体实现,比如这个组件的这个方法调用可能需要返回值,则必须这样调用:
    CComVariant vResult;
    pIDispatch-> Invoke(dispid,   IID_NULL,   LOCALE_USER_DEFAULT,   DISPATCH_METHOD,   &dispparams,   &vResult,   NULL,   NULL); 如果是你自己的控件,跟踪进去看看就知道原因了。
      

  9.   

    可能知道原因了, LZ的activeX应该是用MFC开发的吧假设你的activeX对象的名称杀CTestOcxCtrl, 它继承自COleControl, 而COleControl又最终继承自CCmdTarget,CCmdTarget有一个virtual方法BOOL CCmdTarget::IsInvokeAllowed(DISPID); 你只要OVERRIDE这个方法, 让它返回TRUE就可以了, 例如:virtual BOOL CTestOcxCtrl::IsInvokeAllowed(DISPID dispid)
    {
        return TRUE;
    }
      

  10.   

    crumpy:
    佩服!!!!!!!!!!
      

  11.   


    有谁知道假设 这个控件不支持IsInvokeAllowed  怎样调用?