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;
}
添加接口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表示函数的返回值。如果函数执行失败,则产生异常。
调用COM接口时,只有函数两个参数,最后参数[out,retval]long *pVal表示函数的返回值。如果函数执行失败,则产生异常。
作者: cnzdgs 发布时间: 2011-06-15
#import "com_2.dll"
的时候做了包装, [out,retval]类型的参数都改为返回值了。
的时候做了包装, [out,retval]类型的参数都改为返回值了。
作者: akirya 发布时间: 2011-06-15
你也可以使用
long n;
hr=pFun->raw_Add(16,1,&n);
long n;
hr=pFun->raw_Add(16,1,&n);
作者: akirya 发布时间: 2011-06-15
多谢两位,附带问一下,为什么接口方法的返回值即[out,retval]项只能是指针?
作者: qq752923276 发布时间: 2011-06-15