我用vc6做了个atl com,包装了md5加密函数。
STDMETHODIMP CCrypter::Md5(VARIANT souce, VARIANT *pVal)
{
::VariantInit( pVal ); // 永远初始化返回值是个好习惯
char* strsouce = _com_util::ConvertBSTRToString(souce.bstrVal);
char* md5=new char[16];
char* des= new char[33];
memset(md5,0,16);
memset(des,0,33);
Md5Char((u_char*)md5,(u_char*)strsouce,strlen(strsouce));
StringToHex(md5,16,des);
pVal->vt = VT_BSTR;
pVal->bstrVal =CComBSTR(_com_util::ConvertStringToBSTR(des)).Copy();
delete strsouce;
delete md5;
delete des;
return S_OK;
}
在同一服务器上,用test.vbs脚本文件测试,得到正确结果。
dim cr
set cr=CreateObject("ScriptTool.Crypter") 'ADODB.Recordset
msgbox cr.Md5("abcd")
在test.asp中调用,得出错误结果。
<%
dim cr
set cr=Server.CreateObject("ScriptTool.Crypter")
s="abcd"
response.write "begin<br>"
response.write s
response.write "<br>"
response.write cr.Md5(s)
response.write "<br>end"
set cr=nothing
%>
如果直接
response.write cr.Md5("abcd"),得到正确结果。
应该是内存被垃圾覆盖的原因。怎么处理?
STDMETHODIMP CCrypter::Md5(VARIANT souce, VARIANT *pVal)
{
::VariantInit( pVal ); // 永远初始化返回值是个好习惯
char* strsouce = _com_util::ConvertBSTRToString(souce.bstrVal);
char* md5=new char[16];
char* des= new char[33];
memset(md5,0,16);
memset(des,0,33);
Md5Char((u_char*)md5,(u_char*)strsouce,strlen(strsouce));
StringToHex(md5,16,des);
pVal->vt = VT_BSTR;
pVal->bstrVal =CComBSTR(_com_util::ConvertStringToBSTR(des)).Copy();
delete strsouce;
delete md5;
delete des;
return S_OK;
}
在同一服务器上,用test.vbs脚本文件测试,得到正确结果。
dim cr
set cr=CreateObject("ScriptTool.Crypter") 'ADODB.Recordset
msgbox cr.Md5("abcd")
在test.asp中调用,得出错误结果。
<%
dim cr
set cr=Server.CreateObject("ScriptTool.Crypter")
s="abcd"
response.write "begin<br>"
response.write s
response.write "<br>"
response.write cr.Md5(s)
response.write "<br>end"
set cr=nothing
%>
如果直接
response.write cr.Md5("abcd"),得到正确结果。
应该是内存被垃圾覆盖的原因。怎么处理?
解决方案 »
- 想学VC网络方面的开发该如何入门?
- 急问:关于XP IE侧边栏的问题(浏览器栏)
- 【特殊】VC中如何调用system32的命令行exe
- 高手指导!求BMP图像合并算法!
- 如何删除listctrl中的所有列
- 新手请教:如何做个抽奖程序的界面
- 技术问题!高手进!急!急!急!
- 插入一个usb设备后,自动执行一个自己写的程序,请问如何实现
- 什么地方有Effective C++中文版与Essential C++中文版(英文版)电子图书??(100分)
- 用钩子怎样监控POP-UP型(比如MSN messenger密码输入窗口)窗口的创建
- 我电脑的8080端口怎么了?可以在上面监听,也可以直接连接!
- 求助:各位大哥请帮我看看这个奇怪问题啊?谢谢!
char* strsouce = _com_util::ConvertBSTRToString(souce.bstrVal);
改为
char* strsouce =_com_util::ConvertBSTRToString(*(souce.pbstrVal)) ;多看内存状态是好习惯。