【问题标题】:_bstr_t to char*, amazing result_bstr_t 到 char*,惊人的结果
【发布时间】:2012-12-06 07:52:16
【问题描述】:

第一:

LPCTSTR asdfsdf = (LPCTSTR)(_bstr_t)v;
printf("%s\n", asdfsdf);

秒:

printf("%s\n", (LPCTSTR)(_bstr_t)v);

它们是相同的,但第一个条件导致代码不可读

为什么?

【问题讨论】:

    标签: char bstr


    【解决方案1】:

    _bstr_t class 将 BSTR 封装在 C++ 类中。在您的第一个实例中:

    LPCTSTR asdfsdf = (LPCTSTR)(_bstr_t)v;
    

    您正在创建一个_bstr_t 对象,从中提取LPCTSTR,但随后临时_bstr_t 对象被破坏。无论asdfsdf 指向什么,现在都已被释放,无法再使用。

    在你的第二个例子中

    printf("%s\n", (LPCTSTR)(_bstr_t)v);
    

    临时的_bstr_t 对象直到之后 printf() 被调用后才会被破坏,所以使用LPCTSTR 值没有问题。

    【讨论】:

    • 谢谢,但我还是有问题。上面的变量'v'被声明为:_variant_t v = ret->GetCollect((long)1);正如你所说, _bstr_t 对象不存在,但变量 'v' 仍然存在。为什么这行不通?
    • v 是什么并不重要。问题是_bstr_t 临时对象在构造时会从v 创建数据的副本,并在临时对象被破坏时释放该副本。
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 2018-01-09
    • 2022-06-11
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多