我用vc谢了个函数,调用vb的com,程序如下:
LPSTR CAboutDlg::getdd(LPSTR str)
{
HRESULT hresult;
CLSID clsid;
CoInitialize(NULL);
hresult=CLSIDFromProgID(OLESTR("MD5.MD"), &clsid);
_MD *t;
hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
__uuidof(_MD),(LPVOID*)&t);
if(FAILED(hresult))
{
AfxMessageBox("初始化服务组件失败");
}
BSTR str1;
BSTR strTest=((_bstr_t(str)));
AfxMessageBox(_bstr_t(strTest));////不弹出这个框下面执行就出错,弹出这个框,点确定,就可以往下执行,需求不需要这个框
str1=t->MD5(& strTest);
USES_CONVERSION;
str= W2A(_bstr_t(str1));
// strcpy(s,W2A(_bstr_t(str)));
AfxMessageBox(str);
CoUninitialize();
return str;
}怎么样把那个弹出框去掉,而又可以正常执行??
比较急,就差这一点工作了!!
LPSTR CAboutDlg::getdd(LPSTR str)
{
HRESULT hresult;
CLSID clsid;
CoInitialize(NULL);
hresult=CLSIDFromProgID(OLESTR("MD5.MD"), &clsid);
_MD *t;
hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
__uuidof(_MD),(LPVOID*)&t);
if(FAILED(hresult))
{
AfxMessageBox("初始化服务组件失败");
}
BSTR str1;
BSTR strTest=((_bstr_t(str)));
AfxMessageBox(_bstr_t(strTest));////不弹出这个框下面执行就出错,弹出这个框,点确定,就可以往下执行,需求不需要这个框
str1=t->MD5(& strTest);
USES_CONVERSION;
str= W2A(_bstr_t(str1));
// strcpy(s,W2A(_bstr_t(str)));
AfxMessageBox(str);
CoUninitialize();
return str;
}怎么样把那个弹出框去掉,而又可以正常执行??
比较急,就差这一点工作了!!
而且楼主的函数参数是str,可是却在函数内用str=WSA(_bstr_t(str1))作为局部暂存变量来用,会不会太那个了。
另外,虽然new这么多的_bstr_t不会产生问题,但是有必要吗?str1和strTest完全可以直接定义为_bstr_t的吧,为什么要定义为BSTR呢。
AfxMessageBox(_bstr_t(strTest));////不弹出这个框下面执行就出错,弹出这个框,点确定,就可以往下执行,需求不需要这个框有没有人遇到过同样的问题?怎么解决的?
//这句话有问题,BSTR仅是个指针。((_bstr_t(str)))返回的是一个临时的_bstr_t对象。
当此句话结束后,返回的指针地址的址已经无效。
str1=t->MD5(& strTest);
这句话又对无效的指针处理,肯定会出问题的。
建议改进方法:
CComBSTR strTest;
strTest.AssignBSTR( (_bstr_t(str)) ); //CComBSTR是包装类,可以自动释放字符串
_bstr_t str1=t->MD5(& strTest);