【问题标题】:std::string to LPOLESTRstd::string 到 LPOLESTR
【发布时间】:2011-10-13 08:37:20
【问题描述】:

我有一个这样的字符串数组:

using std::string;
string myArray[] = { string("abc"), string("foo"), string("muh") };

现在我想使用这个功能:

HRESULT Init(T* begin, T* end, IUnknown* pUnk, CComEnumFlags flags = AtlFlagNoCopy );

T 在我的例子中是 LPOLESTR。所以我需要将 std::string 的数组分别转换为 LPOLESTR 我需要一个 LPOLESTR* 来开始和结束这个数组。这是怎么做到的?

提前谢谢

【问题讨论】:

    标签: c++ string com ole


    【解决方案1】:

    ATL 有一个set of macros 用于字符串转换。在您的情况下,您可以使用:

    LPOLESTR olestr = A2OLE(std_str.c_str());
    

    请注意,OLESTR 基本上是 wchar_t*,因此如果您使用 std::wstring(或宽字符字符串文字),您甚至不需要宏:

    LPOLESTR olestr = std_wstr.c_str();
    

    【讨论】:

    • 我知道这是一篇旧帖子,但我也在尝试将 std::string 转换为 LPOLESTR,当我尝试此代码时,我得到“标识符 _lpa 未定义”。我已经包含了 atlbase.h 和 atlconv.h。同样在您链接的文档中,我可以告诉它看起来 A2OLE 旨在将 LPSTR 转换为 LPOLESTR(这就是我们使用 c_str 的原因吗?)。我对 C++ 完全陌生,所以如果我遗漏了一些明显的东西,请原谅,不胜感激,谢谢。
    • @rhowell - 自从我写答案以来,我还没有接触过 COM 的东西,所以可能也会遗漏一些东西。 _lpa 错误可以通过在使用转换宏之前添加 USES_CONVERSION 宏来解决(yuk!)。通常,这些宏在宽字符和常规字符之间转换。 ATL 字符串类型取决于构建(Unicode/ascii),因此转换为/从常规 C/C++ 类型(不依赖于构建)也必须取决于构建。 c_str() 用于获取原始 C 字符串,即指向 chars 数组的指针,因为宏不适用于 C++ std::string 对象。
    • eran 意味着在任何转换调用之前将此行 USES_CONVERSION; 放在函数内部。我误解了它的初衷并最终使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2020-09-17
    • 2011-10-26
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多