我用ATL写了一个COM接口;其中,有函数如下:
STDMETHODIMP CRTDBCOM::CreateObj(BSTR objName,
BSTR objCode, 
BSTR objDESC,
double objhhAlarmVal,
double objhAlarmVal,
double objlAlarmVal,
double objllAlarmVal,
double objMaxVal,
double objMinVal,
BOOL  objSwitch,
BOOL  objConStatus,
BSTR *ret)
{
// TODO: Add your implementation code here
//CRTDB m_rtdb;2006-12-20
_bstr_t oName=objName,oCode=objCode,oDESC=objDESC;
char *cName=oName,*cCode=oCode,*cDESC=oDESC;
char *ss=m_rtdb.CreateObject(cName,
cCode,
cDESC,
objhhAlarmVal,
objhAlarmVal,
objlAlarmVal,
objllAlarmVal,
objMaxVal,
objMinVal,
(BOOL)objSwitch,
(BOOL)objConStatus);
//CComBSTR m_str(ss);
//m_str.CopyTo(ret);
         //m_str.Distach();
USES_CONVERSION;
*ret=A2BSTR(ss);
return S_OK;
}//我的另外一个MFC--Dialog程序中调用的时候就出错了;接口等都已经正常初始化,自同时动化生成的接口如下(由MFC自动生成):void IRTDBCOM::CreateObj(LPCTSTR objName, LPCTSTR objCode, LPCTSTR objDESC, double objhhAlarmVal, double objhAlarmVal, double objlAlarmVal, double objllAlarmVal, double objMaxVal, double objMinVal, long objSwitch, long objConStatus, BSTR* ret)
{
static BYTE parms[] =
VTS_BSTR VTS_BSTR VTS_BSTR VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_I4 VTS_I4 VTS_PBSTR;
InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
 objName, objCode, objDESC, objhhAlarmVal, objhAlarmVal, objlAlarmVal, objllAlarmVal, objMaxVal, objMinVal, objSwitch, objConStatus, ret);
}
在我我的调用如下:
void CTESTCOMDlg::OnOK() 
{
UpdateData();//写入数据;
char* ss=m_tpname.GetBuffer(strlen(m_tpname));//实现CSTRING->BSTR的类型转化;
BSTR *st=new BSTR;
m_rtdbcom.CreateObj(ss,
"FIRST CODE",
"FIRST DESCRIPTION",
0,
0,
0,
0,
0,
0,
FALSE,
FALSE,st);
MessageBox((_bstr_t)(*st));
}问题是:调用过程说“内部应用程序出错”,错误调试代码如下:
Warning: constructing COleException, scode = severity: SEVERITY_ERROR, facility: FACILITY_NULL ($C0000005).
First-chance exception in TESTCOM.exe (OLEAUT32.DLL): 0xC0000005: Access Violation.
First-chance exception in TESTCOM.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception.请高手解决一下。我查了很多资料,发现不了自己调用中的问题。

解决方案 »

  1.   

    感谢各位,问题已经自己解决。就不给大家分了。
    问题的关键在于ATL中,对方法声明时,要返回值时,应该在IDispatch中对函数的返回值给予明确的说明。如:
    HRESULT CreateObj(BSTR objName,
      BSTR objCode, 
               BSTR objDESC,
    double objhhAlarmVal,
    double objhAlarmVal,
    double objlAlarmVal,
    double objllAlarmVal,
    double objMaxVal,
    double objMinVal,
    BOOL  objSwitch,
    BOOL  objConStatus,
    [out,retval]BSTR *ret);//关键处:要表明返回一个BSTR* 类型的值;这样编译器在编译的时候则不把参数ret带入便宜中而留返回值CString接口。测试通过。本贴就不发分了。呵呵,