我在写一个组件时,定义了以下两个借口
// ICertAuth
__interface ICertAuth : IDispatch
{
[id(1), helpstring("method SignAndEncrypt")] HRESULT SignAndEncrypt([in] BSTR SIGNER_NAME, [in] BSTR DECRYER_NAME, [in] BSTR bstrToBeSignedEncrypted, [in,out] BSTR* bstrSignedEncryptedBlob);
[id(2), helpstring("method DecryptAndVerify")] HRESULT DecryptAndVerify([in] BSTR bstrSignedEncryptedBlob, [in,out] BSTR* pbstrDecrypted);
};
在这个SignAndEncrypt接口中BSTR bstrToBeSignedEncrypted为待加密字段,首先转化为BYTE* pbToBeSignedAndEncrypted,经过加密,得到
BYTE* pbSignedAndEncryptedBlob然后再转化BSTR bstrTEMP,再转化成BSTR* bstrSignedEncryptedBlob([in, out])导出。
现在的问题是我可以成功的加密(BYTE* pbToBeSignedAndEncrypted,BYTE* pbSignedAndEncryptedBlob,BSTR bstrTEMP可以看到加密过的字符串),我再用
bstrSignedEncryptedBlob = & bstrTEMP.客户端我使用智能指针LPCTSTR SENDER;       
LPCTSTR RECEIVER; 
LPCTSTR MESSAGE;
BSTR* pENCRYPTED;try
{
ICertAuthPtr pPtr1(
           __uuidof( CCertAuth ));
pPtr1->SignAndEncrypt( SENDER, RECEIVER, MESSAGE,pENCRYPTED) ); 
}
catch (_com_error &err)
{
AfxMessageBox(err.ErrorMessage());
return;
}
但是pENCRYPTED总是无法返回正确的地址,总是一个空指针。这里返回值成为一个指向指针的指针,我找不到解决的办法,已经三天了,没有一点头绪,哥们帮我一把,真的谢谢您了!!!!

解决方案 »

  1.   

    在我的加密组件中我是这么做的:
    例如取key值:
    COM中:
    STDMETHODIMP CEncrypt::get_Key(BSTR *pVal)
    {
    *pVal = m_key;
    return S_OK;
    }
    客户端:
    BSTR bstr;
    Encrypt1->get_Key(&bstr);字符转化成宽字符:
    unsigned char* pKey = new unsigned char[33];
    m_key = new WCHAR[33];
    MultiByteToWideChar(CP_ACP, 0, (char*)pKey, -1, m_key, 33);
      

  2.   

    俺认为:
    "bstrSignedEncryptedBlob = & bstrTEMP."是错误的应该用
    *bstrSignedEncryptedBlob =SysAllocString(bstrTemp)另外,如果你加密完的数据中含有ASCII码0的话,就应该使用
    SysAllocStringLen()俺不知道你在代码中是否还SysFreeString(bstrTemp),别忘记了
      

  3.   

    BSTR bstrTEMP 在程序执行范围超出函数体时,被释放。
    需要new一个BSTR我认为你在客户端得到的指针是没有错的,只可惜指针指向的BSTR已被释放.Allocating and Releasing Memory for a BSTR
    ms-help://MS.VSCC/MS.MSDNVS/vccore/html/vcconStringsAllocatingReleasingMemoryForBSTR.htm
      

  4.   

    Chrisun的方法是错误的,zzyx(菜农)是正确的。
      

  5.   

    如Analyst所说,zzyx(菜农)是正确的。
    我试过了成功了,确实如此。
    指针
    *bstrSignedEncryptedBlob =SysAllocString(bstrTemp);
    是对的。
    不能直接指过去。直接指过去结果是得到空指针,我从Memory 里看了zzyx(菜农)
    我马上再发张帖子,你跟帖,我再给你100
      

  6.   

    zzyx(菜农)的做法很标准,学习中...
    不过我的做法虽然粗暴了点,其实原理也差不多:
    m_key = new WCHAR[33];//SysAllocString(bstrTemp)我的值一样能传出取,唯一不好的是可能需要在客户端释放分配的空间