问题:一个支持自动化的接口函数能不能有多个指针类型的输入参数。
com接口函数原型:
HRESULT ee([in] long * aa,[in] long *bb);客户端程序:
if(FAILED(CoInitialize(NULL)))
{
MessageBox("初始化COM组件出现错误!");
return;
}
CLSID clsid;
HRESULT hr;
hr=CLSIDFromProgID(L"yy.xx",&clsid);
if(FAILED(hr))
{
MessageBox("在注册表中读取组件名出现错误!");
CoUninitialize();
return;
}
IDispatch *pDispatch = 0;
hr=CoCreateInstance(clsid,NULL,CLSCTX_SERVER,IID_IDispatch,(void **)&pDispatch);
if(FAILED(hr))
{
MessageBox("create server instance 出现错误!");
CoUninitialize();
return;
}
LPOLESTR lpOleStr=L"ee";
DISPID dispid;
hr=pDispatch->GetIDsOfNames(IID_NULL,&lpOleStr,1,LOCALE_SYSTEM_DEFAULT,&dispid);
if(FAILED(hr))
{
MessageBox("GetIDsOfNames 出现错误!");
CoUninitialize();
return;
}
    DISPPARAMS dispparms;

memset(&dispparms,0,sizeof(DISPPARAMS));
dispparms.cArgs=2;
    VARIANTARG* pArg=new VARIANTARG[dispparms.cArgs];
dispparms.rgvarg=pArg;
CComVariant vAA,vBB;
vAA.vt=VT_I4;
vBB.vt=VT_I4;
memset(pArg,0,sizeof(VARIANT)*dispparms.cArgs);
dispparms.rgvarg[0].vt=VT_VARIANT|VT_BYREF;
dispparms.rgvarg[0].pvarVal=&vAA;
dispparms.rgvarg[1].vt=VT_VARIANT|VT_BYREF;
dispparms.rgvarg[1].pvarVal=&vBB; hr=pDispatch->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&dispparms,NULL,0,NULL);
if(FAILED(hr))
{
MessageBox("Invoke error");
CoUninitialize();
return;
}
CoUninitialize();错误出现在 invoke函数上 就是dispparms参数出现错误
即出现在 DISPPARAMS 结构中有谁做过这方面工作的人 请指点指点!

解决方案 »

  1.   

    long aa, bb;
    dispparms.rgvarg[0].vt=VT_I4|VT_BYREF;
    dispparms.rgvarg[0].pvarVal=&aa;
    dispparms.rgvarg[1].vt=VT_I4|VT_BYREF;
    dispparms.rgvarg[1].pvarVal=&bb;
      

  2.   

    应该是
    dispparms.rgvarg[0].plVal=&aa;
    dispparms.rgvarg[1].plVal=&bb;
      

  3.   

    这样做不行 dispparms.rgvarg中只能存放VARIANT类型的变量
    我现在想知道 支持自动化的接口中是否允许有指针类型的参数([in])存在
      

  4.   

    dispparms.rgvarg是一个VARIANT数组, 这样做没问题, 但要注意参数的顺序要反过来long aa=100, bb=200;
    dispparms.rgvarg[0].vt=VT_I4|VT_BYREF;
    dispparms.rgvarg[0].plVal=&bb;
    dispparms.rgvarg[1].vt=VT_I4|VT_BYREF;
    dispparms.rgvarg[1].plVal=&aa;
      

  5.   

    you can see ATL ConnectionProxy class code
      

  6.   

    小弟 明白了
    多谢cheng_young(古道西风瘦马)