在C++中,如何初始化指向wchar_t*的指针数组(生成wchar_t**)
In C++, how do you initialize an array of pointers to wchar_t* (resulting in wchar_t**)?
我正在调用一个需要wchar_t**
参数的COM函数。我想做的是:
wchar_t* arr[3] = {L"str1", L"str2", L"str3"};
我得到的是一个const wchar_t**
,编译器拒绝了它。
我也试过:
wchar_t* arr[3];
wchar_t p1[] = L"str1";
wchar_t p2[] = L"str2";
wchar_t p3[] = L"str3";
arr[0] = p1;
arr[1] = p2;
arr[2] = p3;
我得到的是wchar_t* (*)[3]
,编译器也拒绝了它。
我是C++的新手,并且很难理解字符串文字的处理方式。
ETA:我尝试使用的函数是GetIDsOfNames,第二个参数是我遇到问题的地方。我想在该参数中传递3个名称(我可以用wchar_t ptName[] = L"namestring"
成功传递一个名称,但不知道如何在数组中组合多个名称(。
HRESULT GetIDsOfNames(
REFIID riid,
LPOLESTR *rgszNames,
UINT cNames,
LCID lcid,
DISPID *rgDispId
);
您遇到的主要问题是数组必须是指向非常量字符的指针数组,但是您试图使用常量字符的字符串文本。
你在网上找到的大多数调用该函数的例子都忽略了这个问题,因为直到最近,Microsoft编译器才允许出现这种类型的错误(如果你不在严格的标准模式AFAIK中调用它,它仍然允许(。
要在标准C++中设置阵列,代码可以是:
wchar_t p1[] = L"str1";
wchar_t p2[] = L"str2";
wchar_t p3[] = L"str3";
wchar_t* arr[3] = { p1, p2, p3 };
所以整个呼叫可能是:
DISPID dispid[3];
HRESULT result = iFoo->GetIDsOfNames( IID_NULL, arr, 3, LOCALE_SYSTEM_DEFAULT, dispid);
您描述为"我也尝试过:"的代码是正确的,但我猜您错误地将&arr
作为GetIDsOfNames的参数,而不是arr
。
在C++的COM编程中,使用包装类是一种常见的做法,这些包装类为这些底层的C Win32 API函数提供了更方便的C++接口。
const
数据。如果不使用类型转换,就不能将指向常量的指针分配给指向非常量的指针,例如:
const wchar_t* arr[3] =
{
L"str1",
L"str2",
L"str3"
};
...->GetIDsOfNames(..., const_cast<LPOLESTR*>(arr), 3, ...);
或者:
wchar_t* arr[3] =
{
const_cast<wchar_t*>(L"str1"),
const_cast<wchar_t*>(L"str2"),
const_cast<wchar_t*>(L"str3")
};
...->GetIDsOfNames(..., arr, 3, ...);
否则,您将不得不将const
数据的副本复制到非常数数组中,如M.M.的答案所示。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错