我在COM中添加一个Add函数,其中参数a,b是输入值,total是输出值static STDMETHODIMP Add(IExample2 *this, long a,long b,long *total)
{
  *total=a+b;
  return(S_OK);
}现在通过IDispatch中的GetIDsOfNames与invoke来调用Add方法: #include <windows.h>
 #include <adoid.h>
 #include <stdio.h>int main(int argc, char* argv[])
{
   char szName[200];
   char buf[200];
   CLSID clsid;
   HRESULT hr;
   IDispatch* pDispatch;
   OLECHAR* szMember = L"Add";
   DISPID dispid;
   VARIANTARG test = { VT_I4, 0, 0, 0 };
   VARIANTARG vaResult;   
   DISPID dispidnamed = DISPID_PROPERTYPUT;
   DISPPARAMS param = { &test, &dispidnamed, 1, 1 };
CoInitialize(0);   hr = CLSIDFromProgID(L"IExample2.object", &clsid);
  
  hr=CoCreateInstance(&clsid, NULL, CLSCTX_ALL, &IID_IDispatch, (void **)&pDispatch);
  
  if ( SUCCEEDED ( hr ) )
  {
     
      WideCharToMultiByte(CP_ACP, 0, szMember, -1, szName, 256, NULL, NULL);
  pDispatch->lpVtbl->GetIDsOfNames(pDispatch,&IID_NULL, &szMember,1,LOCALE_SYSTEM_DEFAULT,&dispid);
       if(FAILED(hr))
   {
              printf("GetIDsOfNames failed");
      sprintf(buf,"GetIDsOfNames('%s') failed w/err 0x%08lx",szName,hr);
   }else
   {
        //printf("DispID of Visible=%d  ",dispid);
hr = pDispatch->lpVtbl->Invoke(pDispatch,dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYPUT, &param, &vaResult, NULL, NULL);
if(FAILED(hr))
{
   printf("Invoke failed\n");
   sprintf(buf,"Invoke('%s'=%08lx) failed w/err 0x%08lx",szName,dispid,hr);
}
        }
  }
    else
        {
printf("GetIDsOfNames failed\n");
printf("DispID of Visible 0x%08lx  ",hr);
 
        }
 
CoUninitialize();
 return   0;
} 其中参数数组VARIANTARG test = { VT_I4, 0, 0, 0 }设置不对,请大家给看看应该如何设置?

解决方案 »

  1.   

    CComVariant* pvars = new CComVariant[3];
    DISPPARAMS disp = { pvars, NULL, 3, 0 };
    pvars[0] = a;
    pvars[1] = b;
    pvars[2] = total;
      

  2.   

    我这样设置,但还是不对,大家帮我看看
       OLECHAR* szMember = L"Add";
       DISPID dispid;
       VARIANTARG test[3];
       VARIANT arg1,arg2;
       //第一个参数
        arg0.vt= VT_I4;
        arg0.lVal = 1; 
       //第二个参数
        arg1.vt= VT_I4;
        arg1.lVal = 2;  
       //返回值参数
        arg2.vt= VT_I4;      test[0]=arg0;
        test[1]=arg1;
        test[2]=arg2;    VARIANTARG vaResult;   
        dispparamsArgs.rgvarg=vargs;     DISPID dispid;
         DISPPARAMS param = {NULL, NULL, 0, 0};
         param.rgvarg=test;
         param.cArgs = 3;