我用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;
}怎么样把那个弹出框去掉,而又可以正常执行??
比较急,就差这一点工作了!!

解决方案 »

  1.   

    很抱歉,可能没帮助,但个人认为,楼主return str中的str是由W2A而来,在W2A中用alloca分配的内存似乎在你的函数结束后就会自动释放,所以这个str可能会无效。
    而且楼主的函数参数是str,可是却在函数内用str=WSA(_bstr_t(str1))作为局部暂存变量来用,会不会太那个了。
    另外,虽然new这么多的_bstr_t不会产生问题,但是有必要吗?str1和strTest完全可以直接定义为_bstr_t的吧,为什么要定义为BSTR呢。
      

  2.   

    楼上的眼睛好锐利,按楼主的代码,str确实和局部变量没什么区别,而且如果不是BSTR strTest=((_bstr_t(str)));str根本没有传进来的意义了
      

  3.   

    我只是得到str返回的值,这个值会传到安装包安装的过程,会另外分配内存,所以str可能会无效,但是已经取道了该值!!现在问题就是
    AfxMessageBox(_bstr_t(strTest));////不弹出这个框下面执行就出错,弹出这个框,点确定,就可以往下执行,需求不需要这个框有没有人遇到过同样的问题?怎么解决的?
      

  4.   

    这个程序就是模拟传入硬盘序列号,传出生成的XXXX-XXXX-XXXX-XXXX序列号,做安装验证,传入传出的都是一个参数str,都在安装包里!!
      

  5.   

    BSTR strTest=((_bstr_t(str)));
    //这句话有问题,BSTR仅是个指针。((_bstr_t(str)))返回的是一个临时的_bstr_t对象。
    当此句话结束后,返回的指针地址的址已经无效。
    str1=t->MD5(& strTest);
    这句话又对无效的指针处理,肯定会出问题的。
    建议改进方法:
    CComBSTR strTest;
    strTest.AssignBSTR( (_bstr_t(str)) );  //CComBSTR是包装类,可以自动释放字符串
    _bstr_t str1=t->MD5(& strTest);