com调用出现的问题

编写了一个简单的ATL/COM DLL服务
添加接口IFun
添加接口方法 LRESULT Add([in]long n1,[in]long n2,[out,retval]long *pVal);
实现部分:
STDMETHODIMP CFun::Add(long n1, long n2, long *pVal)
{
// TODO: Add your implementation code here
  *pVal=n1+n2;
return S_OK;
}
注册该服务 regsvr32 com_2.dll
再编写一个客户程序
 IFun *pFun=NULL;
HRESULT hr=CoInitialize(NULL);
if (FAILED(hr))
{
return 1;
}
GUID funCLSID;
hr=::CLSIDFromProgID(L"com_2.fun",&funCLSID);

if (FAILED(hr))
{
return -1;
}
//IUnknown *pUnknown=NULL;
hr=::CoCreateInstance(funCLSID,NULL,CLSCTX_INPROC_SERVER,__uuidof(IFun),(void**)&pFun);
if (FAILED(hr))
{
return -1;
}
  long n;
hr=pFun->Add(16,1,&n);
  cout << n << endl;
问题:
当包含相应相应的.c、.h文件时,上述代码正常运行。
当使用
#import "com_2.dll" no_namespace
发现编译不通过(报参数不正常),改为
  long n;
  n=pFun->Add(16,1);//,&n);
  cout << n << endl;
OK
单步发现执行到Add(16,1)时进入下列一段代码
inline long IFun::Add ( long n1, long n2 ) {
  long _result;
  HRESULT _hr = raw_Add(n1, n2, &_result);//调用实际编写方法
  if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
  return _result;
}

作者: qq752923276   发布时间: 2011-06-15

当包含相应相应的.c、.h文件时,Add是程序中的一个函数,按照函数定义传递参数。
调用COM接口时,只有函数两个参数,最后参数[out,retval]long *pVal表示函数的返回值。如果函数执行失败,则产生异常。

作者: cnzdgs   发布时间: 2011-06-15

#import "com_2.dll"
的时候做了包装, [out,retval]类型的参数都改为返回值了。

作者: akirya   发布时间: 2011-06-15

你也可以使用
  long n;
hr=pFun->raw_Add(16,1,&n);

作者: akirya   发布时间: 2011-06-15

多谢两位,附带问一下,为什么接口方法的返回值即[out,retval]项只能是指针?

作者: qq752923276   发布时间: 2011-06-15