【问题标题】:How do I create a variable or constant of type LPOLESTR?如何创建 LPOLESTR 类型的变量或常量?
【发布时间】:2018-12-12 18:38:14
【问题描述】:

我需要LPOLESTR(长指针 OLE 字符串)作为简单函数调用的参数。

根据The Complete Guide to C++ Strings, Part II - String Wrapper Classes

OLECHAR 是一个 Unicode 字符 (wchar_t)

LPOLESTR 是 OLECHAR (OLECHAR*) 的字符串

所以我应该能够做到这一点:

int demo(LPOLESTR ptName) {
    return 1;
}

int main(){
    
    demo(L"Visible");
}

但是我得到一个编译错误:

(const wchar_t[8])L"可见"

“const wchar_t *”类型的参数与“LPOLESTR”类型的参数不兼容

或者我会尝试一个变量:

LPOLESTR lVis = L"Visible";

但是我得到这个编译器错误:

(const wchar_t[8])L"可见"

“const wchar_t *”类型的值不能用于初始化“LPOLESTR”类型的实体

我在顶部有#include <string>

这似乎应该是一件简单的事情,但我整个早上都在谷歌上搜索,找不到答案。如何在 C++ 中创建 LPOLESTR 类型的变量或常量?

【问题讨论】:

  • 如果LPOLESTRwchar_t*,则不能为其分配const wchar_t*。如果您确定该函数不会更改 constness,则可以通过强制转换来删除它。否则,为什么不使用不带 const 的 wchar_t*wchar_t[]
  • @KarstenKoop 好的,我该怎么做。对不起,我是菜鸟。
  • See also this question。似乎LPOLESTR 暗示了它的分配方式,类似于BSTR
  • @KarstenKoop:BSTR 确实是一个非常不同的野兽,在实际字符串部分之前包含一个标题。
  • 你在使用 MFC 或 ATL 之类的框架吗?然后应该有这个帮助类。

标签: c++


【解决方案1】:

您遇到的问题是LPOLESTRtypedefwchar_t*

编译器不允许您将const wchar_t* 转换为wchar_t* 没有明确的const_cast

写作,使用另一种类型LPCOLESTR

LPCOLESTR lVis = L"Visible";

将修复即时编译错误,因为它更像 Windows,并且可能是 Windows 程序员的首选。

一般来说,不建议使用const_cast,但如果函数文档声明它不会尝试修改传递给它的数据,那么您将侥幸成功。

【讨论】:

  • D_Bester:如果我是你,我只会在调用 API 函数时使用 const_cast,然后检查函数文档以确保它不会修改字符串。
  • @PasserBy:已删除,并使用正确的 Windows typedef 修复。
  • 这实际上对我不起作用,直到我使用 LPOLESTR lVis = const_cast <wchar_t *>(L"Visible"); 所以也许编辑它。或者也许还有其他原因。
  • 我确实检查以确保我定义了 UNICODE 宏
  • @D_Bester:注意 LPCOLESTR 中的 C
猜你喜欢
  • 2016-02-15
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
相关资源
最近更新 更多