VARIANT rVal;
rVal.vt = VT_BSTR;
rVal.bstrVal = ::SysAllocString(L"hello");这样调用没错
::MessageBox(NULL, "result:" + (CString)rVal.bstrVal, "MsgBox", MB_SETFOREGROUND);但我想转换成LPCTSTR,却不行。
::MessageBox(NULL, "result:" + (LPCTSTR)rVal.bstrVal, "MsgBox", MB_SETFOREGROUND);不知哪位大虾能够指点一下。

解决方案 »

  1.   

    BSTR在存贮字符串的时候,是从第1个字节才开始存贮的,第0个字节用于存储字符串的长度。
    所以你改成如下形式应该就行了
    (LPCTSTR)(rVal.bstrVal+1)
      

  2.   

    可以这样:
    需要#include "COMDEF.H"_variant_t t;
    t.SetString ("fa");
    CString str = (char *)(_bstr_t(t));
      

  3.   

    忘了说,_variant_t 是MS写的VARIANT的操作包装类。
      

  4.   

    "result:" + (LPCTSTR)rVal.bstrVal中间不能用加号
      

  5.   

    (LPCTSTR)(rVal.bstrVal+1
    只能输出字符串中的第一个字符,不正确"result:" + (LPCTSTR)rVal.bstrVal
    中间不能用加号
    对了,但没达到我要的结果。需要#include "COMDEF.H"_variant_t t;
    t.SetString ("fa");
    CString str = (char *)(_bstr_t(t));
    怎么改写我的那个程序,麻烦写详细一点
      

  6.   

    这样
    _variant_t t;
    t.SetString ("hello");然后这样调用
    CString str = (char *)(_bstr_t(t));
    str = "result:" + str;::MessageBox(NULL, str, "MsgBox", MB_SETFOREGROUND);就可以了嘛.
      

  7.   

    winthegame(120斤重的大青蛙) :为什么这样写,是因为我通过自动化接口调用,得到的是VARIANT类型封装的。
    VARIANT rVal;
    rVal.vt = VT_BSTR;
    rVal.bstrVal = ::SysAllocString(L"hello");而我想把它转换成char*,然后我要做一些字符串的拷贝,以及取子串操作。_variant_t aaa = new _variant_t(rVal);
    char *bbb = (char *)(aaa);这样我试了一下,不行,麻烦指正
      

  8.   

    用个中间变量将字符转换完后在显示
    CString strMSG=_T("result:")+(CString)rVal.bstrVal
    在显示strMSG
      

  9.   

    对不起,是我没说明白,我主要不是为了::MessageBox(NULL, "result:" + (LPCTSTR)rVal.bstrVal, "MsgBox", MB_SETFOREGROUND);
    是我写错了。我问题的关键是,怎样将VARIANT 类型的字符串转换成char *类型的字符串。
      

  10.   

    static_cast<const char*>(rVal)
      

  11.   

    好了,我解决了。解决方法如下:char *aaa = new char[32];
    strcpy(aaa, (LPCTSTR)((CString)getNotesString.bstrVal));多谢各位帮助。
      

  12.   

    _variant_t aaa;aaa.SetString("fdajkf;");这里的aaa已经是VARIANT类型的字符串了。可以直接使用它。
    如果要转为char * 可以用char *bbb = (char *)(_bstr_t(aaa));
    就可以了嘛...就转出来了...