我用atl 作了一个组件接口如下
interface Ijdjh : IDispatch
{[id(1), helpstring("method getrs")] HRESULT getrs([in] BSTR sql ,[out] BSTR* errmsg,[out] VARIANT_BOOL*  ,[out,retval] IDispatch **rs);
};errmsg是错误信息为成功标志rs是返回的记录集
在vb调用组件正常!!但在asp中调用事出错!!
set rs = Server.CreateObject("adodb.recordset")
set zj=server.CreateObject ("JD_JDJH1.jdjh")
dim errmsg
dim  
sql="select * from jd_qyyjh"
set RS=zj.getrs(sql,errmsg,)‘出错位置
Response.Write 
Response.Write cstr(rs.RecordCount )
set RS=nothing
set zj=nothing
Response.end
但如果组件中去掉errmsg,的返回参数,asp调用就正常,请教各位事什么原因

解决方案 »

  1.   

    dim errmsg
    dim  
    在asp里是变体,
    你写的组件这两个参数也要是变体才行
      

  2.   

    将你的接口修改如下:
    interface Ijdjh : IDispatch
    {[id(1), helpstring("method getrs")] HRESULT getrs([in] BSTR sql ,[out] VARIANT* errmsg,[out] VARIANT*  ,[out,retval] IDispatch **rs);
    };原因:
    VBScript是弱类型语言,在VBScript中定义的变量都是Variant类型的。而C++是强类型语言,所以在接口中定义的输出参数的类型就必须是VARIANT类型的。
      

  3.   

    我改了
    interface Igtwo : IDispatch
    {[id(1), helpstring("method getrs")] HRESULT getrs([in] BSTR sql ,[out] VARIANT* errmsg,[out] VARIANT*  ,[out,retval] IDispatch **rs);};
    但在组件种写了
    BSTR btt=::SysAllocString(L"OK");
    _variant_t aa;
    aa.vt=VT_BSTR;
    aa.bstrVal =btt;
    *errmsg=aa;_variant_t bb;
    bb.vt=VT_BOOL;
    bb.boolVal = VARIANT_TRUE;
    *=bb;
    在客户端为什么取不到errmsg,的值
      

  4.   

    我改了
    interface Igtwo : IDispatch
    {[id(1), helpstring("method getrs")] HRESULT getrs([in] BSTR sql ,[out] VARIANT* errmsg,[out] VARIANT*  ,[out,retval] IDispatch **rs);};
    在vb中调试正常,
    asp 运行提示Active Server Pages, ASP 0115 (0x80004005)
    外部对象中发生一个可捕捉的错误(E06D7363)。脚本无法继续执行。
    如何处理,请各位给个提示,谢谢
      

  5.   

    我又看了一下你的asp代码,调用组件的时候还有一个小问题。
    如果你的接口定义保持现在这个样子,那么你在asp中调用应该是这样的:
    set RS=zj.getrs("select * from jd_qyyjh", errmsg, )
      

  6.   

    在asp中调用组件接口的方法时,如果一定要用asp中定义的变量作为参数的话,所有的输入、输出参数都应该用VARIANT来定义。
      

  7.   

    我按照 Stepdev(海纳百川 有容乃大)的建议改了,但是在vb中调试取不到errmsg的值,和rs可以取到,在asp中有时可以取到和rs可以取到,有时提示本页无法显示 
    错误类型:
    (0x800703E6)
    /workshopplan/qyjh/aa.asp, 第 16 行
    16行:set rs=zj1.getrs("select * from jd_qyyjh", errmsg, )
      

  8.   

    出现一个怪现象,每当第一次调用该组件时可以取到errmsg的值,马上重新刷新就去不到errmsg的值了,这是什么问题,请教各位,谢谢!!
      

  9.   

    STDMETHODIMP Cjdjhinf::getrs(BSTR sql, VARIANT *errmsg, VARIANT *, IDispatch **rs)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    CConstr getconstr;
    _ConnectionPtr m_pconnect;
    _RecordsetPtr m_precordset;
    HRESULT hr;
    BSTR bconstr;
    bconstr=getconstr.getconnstr ();
    _variant_t m_;
    m_.vt =VT_BOOL;
    CComBSTR m_errmsg;
    try{
    hr=m_pconnect.CreateInstance ("ADODB.Connection");
    }
    catch(_com_error &e)
    {
    _bstr_t temp=e.Description() ;
    m_errmsg=temp.copy ();
    m_=VARIANT_FALSE;
    *=m_;
    *errmsg=(_variant_t)m_errmsg.Detach ();
    return S_FALSE;
    }
    if (FAILED(hr))
    {
         m_=VARIANT_FALSE;
    *=m_;
    m_errmsg.Append ("建立数据库连接实例失败!");
    *errmsg=(_variant_t)m_errmsg.Detach ();
    return hr;
    }
    hr=m_pconnect->Open (bconstr,"","",adModeUnknown);
    if (FAILED(hr))
    {
    m_=VARIANT_FALSE;
    *=m_;
    m_errmsg.Append ("连接数据库失败!");
    *errmsg=(_variant_t)m_errmsg.Detach ();
    return hr;
    }
    try{
    hr=m_precordset.CreateInstance ("ADODB.Recordset");
    }
    catch(_com_error &e)
    {
    _bstr_t temp=e.Description() ;
    m_errmsg.Append (temp.copy());
    m_=VARIANT_FALSE;
    *=m_;
    *errmsg=(_variant_t)m_errmsg.Detach ();
    return S_FALSE;
    }
    if (FAILED(hr))
    {
         m_=VARIANT_FALSE;
    *=m_;
    m_errmsg.Append ("建立数据库记录集实例失败!");
    *errmsg=(_variant_t)m_errmsg.Detach ();
    return hr;
    }
    m_precordset->CursorLocation = adUseClient;
    m_precordset->Open (sql,(_variant_t)(IDispatch *)m_pconnect,adOpenStatic,adLockReadOnly,adCmdUnknown);
    *rs=(IDispatch*)m_precordset.Detach ();
    m_errmsg.Append ("数据库记录集返回成功!");
    *errmsg=(_variant_t)m_errmsg.Detach ();
    m_=VARIANT_TRUE;
    *=m_; return S_OK;
    }
      

  10.   

    给你一个建议,不敢保证一定就行,但应该能够解决某些问题。

    *rs=(IDispatch*)m_precordset.Detach ();
    之前加一句
    m_precordset->putref_ActiveConnection(NULL);
    在Recordset对象Open成功后,将Recordset对象与数据库之间的连接断开,有利于减轻服务器的负荷。也许能够解决刷新的问题。
      

  11.   

    asp调用com组件只需要写出输入参数,不需要写输出参数,所以你的调用有问题