编写了一个简单的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;
}

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

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

  5.   

    C里面已经很明确了,要想通过参数传出值,则必须使用指针。(C++为指针或引用)
    out 明确表明了,通过参数传出数据。