在C++中,如何初始化指向wchar_t*的指针数组(生成wchar_t**)

In C++, how do you initialize an array of pointers to wchar_t* (resulting in wchar_t**)?

本文关键字:wchar 指针 数组 生成 C++ 初始化      更新时间:2023-10-16

我正在调用一个需要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++接口。

字符串文字是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.的答案所示。