RemoteCall是我写的一个调用自动化组件的方法。
我写了一个测试组件。有4个方法:
STDMETHOD(hello4)(BSTR hello);
STDMETHOD(hello3)(int i);
STDMETHOD(hello2)();
STDMETHOD(hello1)(BSTR first,BSTR second);
结果STDMETHOD(hello3)(int i);
    STDMETHOD(hello2)();都能正确执行。
但是STDMETHOD(hello4)(BSTR hello)出问题,
该方法只是简单的:::MessageBox(NULL,OLE2A(hello),"hbf", MB_OK);
结果应该打出hello值,但奇怪的是打出“addref”而STDMETHOD(hello1)(BSTR first,BSTR second);报”变量类型不正确“
我观察了一下,getIDSofName会把参数值改成“addref",对hello4来说
参数改变不影响执行,只是结果错了。而对hello1,只传入一个实参,报错!!
为什么会这样??template<class T>
void RemoteCall(REFCLSID CLSID, BSTR MethodName,vector<T> params )
{
  
  HRESULT hr;
  IUnknown *pU;
  IDispatch *pD;
  DISPID DispIds[1];
  int cArgs=params.size();
  VARIANTARG *rgvarg=NULL;//new VARIANTARG[cArgs];
 try{ 
  if(cArgs)
  {
   vector <T>::reverse_iterator  it;
   vector <T> vtemp;
   for(it=params.rbegin();it!=params.rend();it++)
     vtemp.push_back(*it);    
   rgvarg=new VARIANTARG[cArgs];
   for(int i=0;i<cArgs;i++)
   {  
    
    CComVariant param(vtemp.at(i));
rgvarg[i]=param;
   }
  }
  
    DISPPARAMS dpParms = { rgvarg, NULL, cArgs, 0};
 
  hr=CoCreateInstance(CLSID,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(void**)&pU);
  TESTHR(hr);
  hr=pU->QueryInterface( __uuidof(IDispatch), (void**)&pD );
  TESTHR(hr);
  hr = pD->GetIDsOfNames(
        IID_NULL,
        &MethodName,
        1,
        LOCALE_SYSTEM_DEFAULT, 
        DispIds
        );
  TESTHR(hr);
  hr = pD->Invoke(
        DispIds[0], 
        IID_NULL,
        LOCALE_SYSTEM_DEFAULT,
        DISPATCH_METHOD,
        &dpParms,
        NULL,
        NULL,
        NULL);
  _com_raise_error(hr);
  TESTHR(hr);
  }catch(_com_error e)
   {
      MessageBox(NULL, e.ErrorMessage(), _T("Error"), MB_OK);
   
  }
  catch(...)
  {
   MessageBox(NULL, "error fuck", _T("Error"), MB_OK);
  }
   pU->Release();
   pD->Release();
}

解决方案 »

  1.   

    把你这段:
     if(cArgs)
      {
       vector <T>::reverse_iterator  it;
       vector <T> vtemp;
       for(it=params.rbegin();it!=params.rend();it++)
         vtemp.push_back(*it);    
       rgvarg=new VARIANTARG[cArgs];
       for(int i=0;i<cArgs;i++)
       {  
        
        CComVariant param(vtemp.at(i));
    rgvarg[i]=param;
       }
      }
      
        DISPPARAMS dpParms = { rgvarg, NULL, cArgs, 0};
    替换成这样就可以了:
    CComVariant* rgvarg = NULL;
    if(cArgs)
    {
    rgvarg = new CComVariant[cArgs];
    for(int i = 0; i < cArgs; ++i)
    rgvarg[i] = params[cArgs - 1 - i];
    } DISPPARAMS dpParms = {(VARIANTARG*)rgvarg, NULL, cArgs, 0};
      

  2.   

    谢谢Analyst兄,现在单个参数的STDMETHOD(hello4)(BSTR hello)能正常执行,但
    多参数的STDMETHOD(hello1)(BSTR first,BSTR second)有异常,而且
    catch(_com_error e)
       {
          MessageBox(NULL, e.ErrorMessage(), _T("Error"), MB_OK);
       
      }
    捕捉不到。
    谢谢,非常感谢,调了几天了,不知错在哪里。
      

  3.   

    而且
    catch(_com_error e)
       {
          MessageBox(NULL, e.ErrorMessage(), _T("Error"), MB_OK);
       
      }
    捕捉不到。-GX 编译选项中 打开没有
      

  4.   

    问题是这个异常不是_com_error,
    如果是 _com_error,如输入的参数个数不对,那么可以捕捉到,提示“无效的参数个数”。
    真的很麻烦,各位救急啊!!