我在写一个组件时,定义了以下两个借口
// 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总是无法返回正确的地址,总是一个空指针。这里返回值成为一个指向指针的指针,我找不到解决的办法,已经三天了,没有一点头绪,哥们帮我一把,真的谢谢您了!!!!
// 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总是无法返回正确的地址,总是一个空指针。这里返回值成为一个指向指针的指针,我找不到解决的办法,已经三天了,没有一点头绪,哥们帮我一把,真的谢谢您了!!!!
例如取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);
"bstrSignedEncryptedBlob = & bstrTEMP."是错误的应该用
*bstrSignedEncryptedBlob =SysAllocString(bstrTemp)另外,如果你加密完的数据中含有ASCII码0的话,就应该使用
SysAllocStringLen()俺不知道你在代码中是否还SysFreeString(bstrTemp),别忘记了
需要new一个BSTR我认为你在客户端得到的指针是没有错的,只可惜指针指向的BSTR已被释放.Allocating and Releasing Memory for a BSTR
ms-help://MS.VSCC/MS.MSDNVS/vccore/html/vcconStringsAllocatingReleasingMemoryForBSTR.htm
我试过了成功了,确实如此。
指针
*bstrSignedEncryptedBlob =SysAllocString(bstrTemp);
是对的。
不能直接指过去。直接指过去结果是得到空指针,我从Memory 里看了zzyx(菜农)
我马上再发张帖子,你跟帖,我再给你100
不过我的做法虽然粗暴了点,其实原理也差不多:
m_key = new WCHAR[33];//SysAllocString(bstrTemp)我的值一样能传出取,唯一不好的是可能需要在客户端释放分配的空间