我写了一个控件,里面有一个方法如下:
BSTR CTestCardCtrl::cardquery(short com, LPCTSTR pUpdata)
{
    char pDownData[200];
    card_query(com,(char *)pUpdata,pDownData);
    return (BSTR)pDownData;
}//card_query(com,(char *)pUpdata,pDownData)最后的结果放在pDownData里,
想通过return 将最后的结果以字符串形式返回给调用的web,但现在发现每次执行到return 是就会报错.请给位大侠多多指点,看是不是方法选用的Bstr型有问题啊?(pUpdata是web传过来的字符串参数,
web里是这样调用的:test1.cardquery(1, '1213');)

解决方案 »

  1.   

    基本概念没搞清楚1,你的控件方法应该定义如下:(STDMETHODIMP) CTestCardCtrl::cardquery(short com, BSTR pUpdata, BSTR *pRet)2、接口定义
    cardquery([in]short com, [in]BSTR pUpdata, [out,retval]BSTR *pRet)3、方法实现
    HRESULT CTestCardCtrl::cardquery(short com, BSTR pUpdata, BSTR *pRet)
    {
        char pDownData[200];
        card_query(com, _bstr_t(pUpdata) ,pDownData);
        *pRet = CComBSTR(pDownData).Detach()
        return(S_OK);
    }
      

  2.   

    另外还要考虑BSTR是unicode,不应该使用char*应该用TCHAR
      

  3.   

    非常谢谢luotasha!但有个问题是,
    1,你的控件方法应该定义如下:(STDMETHODIMP) CTestCardCtrl::cardquery(short com, BSTR pUpdata, BSTR *pRet)
    这个方法是被Web调用,请问在Web里能传一个地址过来存放返回值吗?
    2、接口定义
    cardquery([in]short com, [in]BSTR pUpdata, [out,retval]BSTR *pRet)
    由于接口是别人的DLL提供的,没有办法将参数改为BSTR类型,能不能在不改接口的条件下转化过来啊?再次谢谢!
      

  4.   

    本人头一玩ActiveX, 请大家多多帮助,谢谢先!
      

  5.   

    COM的原则是内部分配,外部释放,与API习惯正好相反你无法直接从Web定义指针,传进COM,不过其实retval参数已经是传进指针了如果你需要更灵活的指针,可以在web里定义jscript的function传入COM内获取的是IDispatch指针,有些繁琐
      

  6.   

    luotasha:非常谢谢! 我想将接口定义
    cardquery([in]short com, [in]BSTR pUpdata, [out,retval]BSTR *pRet)
    改为:cardquery([in]short com, [in]BSTR pUpdata)
    也就是说不传地址下来存放返回值,而是最后通过return 返回返回值,能行吗?我应该怎样定义控件方法啊?