1、你都不知道,我哪儿知道!?或许是例子中的而已;
2、好像不是 COPY 的问题吧?看看这个吧!http://www.devx.com/free/mgznarch/vcdj/1998/dec98/comstring1.asp
3、取决于 _UNICODE 是否定义;
4、不能,COM 准则就是只能通过 HRESULT 来返回错误;
5、用 MAKE_HRESULT;
5.1. 不明白,我头也大了,没在书上找到你写的代码。

解决方案 »

  1.   

    1.IID_IEncrypt应该是个GUID
    2.certainly!
    3.看看FormatMessage的定义
    ...
    #ifdef _UNICODE
    typedef FormatMessageW FormatMessage
    #else
    typedef FormatMessageA FormatMessage
    ...
    如果你要不受 _UNICODE宏控制,请直接使用FormatMessageA或FormatMessageW
    你说MSDN上找不到定义,它的定义跟FormatMessage一样,只不过字符串的定义是LPWSTR
    4.当然可以.截获错误以后以约定的方式告诉客户端.
    5.如果你知道GetLastError()如何工作的,那么相信这个问题不成为问题.
    你可以在服务端维护一个错误号.如果某一方法产生错误,先设置错误号,返回S_FALSE.提供一个方法诸如:
    HRESULT get_last_server_errro([out]DWORD *dwCode)
    {
        *dwCode = 你维护的错误信息;
        return S_OK;
    }
      

  2.   

    to edyang:
    1.在我在COM中使用IDD_IEncrypt,我的组件名叫Encrypt,感觉是GUID,可是我不知道它在哪里写义?
    2.上次地址有问题,这个行,我好好看。
    3.COM在95或NT上都可以运行,可95只支持部分的UNICODE API,而且书上说COM是使用UNICODE,这与定不定义有关系吗?
    4.你误解我的意思了,我的意思是能在COM中使用try...catch;,处理发现在程序中的错误,但并不把错误给Client。
    5.MAKE_HRESULT如何用,假如我使用CryptEncrypt返回失败,我想把::GetLastError()的ID与::FormatMessage的错误信息,返回给Client,我该如何使用这个宏?(给段代码吧!)
    5.1在《Inside COM》(中文译本)第199页,我就是参照它的。
    再帮帮我吧!
      

  3.   

    to wjf:
    1.IID_IEncrypt应该是个GUID,可是我不知道它在哪里写义?
    4.如何做(给段代码吧!)
    5.像我在ASP中使用ADO的对象方法中,如何发生错误时,在ASP会显示出错误来,包括错误号与错误信息,这只想做到这一步,用专门一个方法的话,ASP知道吗?我该如何做哪?
      

  4.   

    难道大家学习COM都没有遇到过这些基本问题吗?,救命呀!
      

  5.   

    1、我不知道!你用 ATL 生成的工程?
    2、上次对不起了;
    3、SysAllocString/SysFreeString/...
    4、当然可以,但不能跨越组件边界;
    5、return err == 0 ? S_OK : MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, err);
    5.1 天哪!我的是 E 文的,199 页找不到!
      

  6.   

    to edyang:
    1.是用ATL生成工程
    再问:
    1.我在我的组件的构造函数使用SysAllocString到一个类变量指针里,可该对象没有析构函数,该在哪里delete.
    2.以下你码该如何改(C++基础差):
    STDMETHODIMP CEncrypt::Encrypt(BSTR *pEncryptString)
    {char *pData=(char*)_bstr_t(pEncryptString);//编译出错
    也就是如何把**指针赋给*指针呢?
      

  7.   

    to edyang:
    5.你这各方法如何返回Error Decription呢?
      

  8.   

    问题1已找到了,在xxxx_i.c中定义
      

  9.   

    把问题整理一下:
    1.在COM中有一个方法中,调动WINAPI出错,程序中如何把取得的错误返回告诉客户端?
      edyang提到用return err == 0 ? S_OK : MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, err);
      可是该方法如何返回Error Decription呢?
    2.以下是我从《Inside COM》中摘出来的处理Error,高手帮我看一下:
    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;//该处该返回啥值比较好!还是E_FAIL,还是用MAKE_HRESULT等。
    我如何把::GetLastError()放到哪里才能让Client端收到。
    还有别的方法吗? 
      

  10.   

    当你的方法失败的时候,
    用 Return Error(" your error decription "),客户端用
    try
    {
       //调用组件的方法
    }
    catch (_com_error e)
    {
      MessageBox((LPCTSTR)e.Description(),"MessageBox",MB_OK|MB_ICONSTOP);
    }