1、通过 HRESULT;COM 的标准不允许跨越组件的异常;参考 MAKE_HRESULT 宏;
2、在用法上 BSTR 和 LPOLESTR 一样;参看http://www.devx.com/free/archives/default.asp?pubid=9
3、不知道,没查过,能用就行。

解决方案 »

  1.   

    再问1:我在方法中调用WIN API,如果API产生错误,我在程序中是不是需要把错误取出来,再通过COM传给客户,还是在程序中直接返回,客户端会自动去取?对了,《Inside COM》中是使用SupportErrorInfo等,不是使用MAKE_HRESULT宏,我查一下。
      

  2.   

    再问2:我的意思是我现要把BSTR指针的内容拷贝到LPOLESTR指针上,strcpy可以吗?
      

  3.   

    再问4:我在一个ASP组件对象中有构造函数使用SysAllocString()分配内存在该对象的类变量,在DLL Release memory的时候,我要调用SysFreeString(),可是好像该对象没有析构函数,我在哪儿处理。
      

  4.   

    高手们,帮助,我已加到100分,不过再加。我已经在Acitve X/COM放了N开了。
      

  5.   

    补充:再问2:我的意思是我现要把BSTR指针的内容拷贝到LPOLESTR指针上,wcscpy()可以吗?(非strcpy()) 
      

  6.   

    简单地,你可以用_bstr_t来做到。
    BSTR bs;
    _bstr_t bt;
    LPOLESTR lpos;
    bs = L"song";
    bt = bs;
    lpos = bt.copy();S_OK定义在:winerror.h中。
      

  7.   

    我来回答BSTR的问题,答对可要给分哟。
    BSTR是COM使用的特殊字符串类型,它的开头是BSTR
    所包含的字符串的字节长度,然后才是字符串,该字符串以null
    结束,不过普通的字符串中间是不允许包含null的,但是BSTR
    允许,因为它前面已经有该字符串的长度了。如果要在BSTR和我们
    所常见的字符串类型转换,一般不必自己转换,用_bstr_t类就可以。
    这也是微软所推荐的。比如要从BSTR m_bstrA 转为 char*
    可以这样:
    char* pStr;
    pStr = (char*)_bstr_t(m_bstrA);
    很简单吧。
    如果要从char* pStr转为BSTR,这样作:
    BSTR m_bstrA;
    m_bstrA = _bstr_t(pStr).copy();
    其它类型转换我没试过,不过从char*转为
    LPCTSRT之类应该就不会太难了。关于BSTR和OLESTR
    可以继续查看MSDN,回答满意吗,欢迎交流,如果那位
    路过的高手发现了我的错误,也请一定指出,以免错误
    流传,成为我的过错,谢谢。
      

  8.   

    我用文件管理器的查找找到了,谢谢大家。
    对了,songyl:
    bt.copy是返回BSTR,我如果想把BSTR内容拷贝到LPOLESTR指针上了呢?CComBSTR类与_bstr_t在使用上有何区别?,它放在MSDN哪里?,每次都要用查指,我想看所有的_bstr_t之类的帮助。
      

  9.   

    高手们,还有第一个问题呀!如下:
    再问1:我在方法中调用WIN API,如果API产生错误,我在程序中是不是需要把错误取出来,再通过COM传给客户,还是在程序中直接返回,客户端会自动去取?对了,《Inside COM》中是使用SupportErrorInfo等,我该如何用呢? 
      

  10.   

    不用_bstr_t与CComBSTR类的话,如何把BSTR拷贝到OLECHAR *上,是否还是:
    char* pStr;
    pStr = (char*)m_bstrA;
      

  11.   

    win api的错误应该自己处理。或者通过其他双方约定的错误号返回给客户端。ms不赞成(me too)通过HRESULT返回值来传递用户自定义错误号。好一点的做法是自己维护一个错误号,或者用OUT参数来报告错误.
      

  12.   

    如何做?,还有呀,在我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID?
      

  13.   

    把问题重新整理一下:
    1.在COM中有一个方法中,如何某处出错,程序中如何返回错误告诉客户端?
    2.不用_bstr_t与CComBSTR类的话,如何把BSTR拷贝到OLECHAR *上::
    char* pStr;
    pStr = (char*)m_bstrA;这样对吗?
    3.在我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID? 
      

  14.   

    再加上:在COM中调用WIN API,产生错误,使用FormatMessage()返回字符是Ansi还是UNICODE,也就是说所有WIN API调用有返回字符串的字符串是ANSI还是UNICODE?
      

  15.   

    1.在你的方法里加一个参数(OUT),用来指明错误。或者维护一个错误号属性
    2.BSTR 被定义为 OLECHAR*; OLECHAR被定义为WCHAR;WCHAR被定义为wchar_t;所以请用
      wcscpy
    3.IDD_IEncrypt没听说过.
    4.FormatMessage有两个版本FormatMessageA,FormatMessageW.如果你定义了_UNICODE,那
      返回的就是UNICODE
      

  16.   

    wjf,谢谢你的回答,你的回答我有几点不懂:
    问题1:我希望我的ASP组件给错的话,可以让VB或ASP网页检测到,就像VB那样能检测到ADO的COM组件的错误一样,使用属性VB知道吗?
    问题2:BSTR在书上说的是一种VB的字符串,应该不是OLECHAR*,它与C的字符串是有点不同,它是由两部分组成,有一个头,记录这个字符串的数量,第二部分是与C的字符串是一样的。
    问题3:IDD_IEncrypt是输错了,应为IID_IEncrypt,我的组件名是Encrypt.
    问题4:在MSDN找不到FormatMessagW的定义呀!
      

  17.   

    1 创建ATL对象时,加入ISupportErrorInfo接口,使用Error返回错误描述,客户端通过异常处理捕获错误。
    2 如果是copy,用wstrcpy就可以。
    如果BSTR中包含L'\0',可以用wstrncpy,BSTR的长度通过SysStringLen获得。
      

  18.   

    把问题重新再整理:
    1.在COM中有一个方法中,如何某处出错,程序中如何返回错误告诉客户端?
    2.在我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID? 
    3.在COM中调用WIN API,产生错误,使用FormatMessage()返回字符是Ansi还是UNICODE,也就是说所有WIN API调用有返回字符串的字符串是ANSI还是UNICODE? 
      

  19.   

    以下是我从《Inside COM》中摘出来,高手帮我看一下:
    ICreateErrorInfo *pErrorInfo;
    pErrorInfo->SetGUID(IID_IEncrypt);
    pErrorInfo->SetSource(L"ASPEncrypt.Encrypt");
    pErrorInfo->SetDescription(szErrorText);
    IErrorInfo *pErrInfo;
    pErrorInfo->QueryInterface(IID_IEncrypt,(void**)&pErrInfo);
    SetErrorInfo(::GetLastError(),pErrInfo);//其中第一个参数在Client能得到吗?,放到哪里好呢?
    pErrInfo->Release();
    pErrorInfo->Release();
    return E_ABORT;//该处该返回啥值比较好!
      

  20.   

    我在COM中进行字符转换时如下:
           BSTR bstr;
           LPCSTR lpStr;
           USES_CONVERTION;   //表明要使用字符转换功能的宏
           lpStr = A2T(bstr); //好象是这样,A和T分别代表不同的字符串类型
            
      

  21.   

     其它的代表字符串的宏请看看MSDN,我忘了,SORRY
    对于1,不太明白问题问的是什么,呵呵
    对于2,IID_IEncrypt就是你的接口别称,最好也看看DirectX的编程(里面要大量应用COM接口)
    对于3,我想返回的是UNICODE,因为在COM中用的都是UNICODE
      

  22.   

    再问:在COM方法中能不能使用try...catch?
      

  23.   

    to lhxx:
        应该是 lpStr = OLE2A(bstr) 或 lpStr = W2A(bstr)
        A=ANSI, T=TCHAR, W=wide char(wchar_t), OLE=OLECHARto vcmfc:
        可以使用异常处理
      

  24.   

    1。调用COM方法时方法会返回HRESULT值。该值有以S_开头的(SUCCESS),表示调用成功;有以E_开头的(ERROR),表示调用失败。只要你返回以E_开头的HRESULT值,ASP中不写ON ERROR RESUME NEXT,网页上就会报错。2。IID_*是一个GUID,以下的事情我没有做过,但我想是可行的。让你的接口支持ISupportErrorInfo接口(因为我想缺省下用ATL生成的ASP组件是不支持该接口的),具体可参看ATL生成的Simple Object的源码。然后在要报错的地方写Error((BSTR)bstr, IID_*, (HRESULT)hr)即可。这样客户端会弹出对话框,显示的错误信息就是bstr的内容。3。调用WIN API函数一般返回值会表明是否函数调用出错。如出错,你要调用GetLastError来获得DWORD的错误号。然后可以用FormatMessage来得到该错误号的字符串说明。其实FormatMessage是一个宏(决大多数WIN API都是这样),对应的是两个版本的同一功能的函数:FormatMessageA(ANSI版)和FormatMessageW(UNICODE版)。到底用的是哪一个函数,就看你编译的是不是UNICODE版的了,即你有没有定义UNICODE和_UNICODE两个宏。4。在COM中可以用try,catch块,但在Project->Settings->C/C++->C++ Language下要选中Enable Exception Handling。如果你用try,catch块,可在catch块中可以这样写:Error((BSTR)e.Description, IID_*, e.Error())(e是_com_error)。又:拷贝BSTR只要用SysAllocString和SysFreeString就可以了。
      

  25.   

    大伙们,我新开一个专门讨论的,这个已经不能给分了。
    http://expert.csdn.net/TopicView.asp?id=46400 标题:COM高手位!,请你们顺手帮俺解决几个小问题呀!
    http://expert.csdn.net/TopicView.asp?id=46567 标题:凡是跟COM沾边的都来看一看。