0

我正在调用一个需要wchar_t**参数的 COM 函数。我想做的是:

wchar_t* arr[3] = {L"str1", L"str2", L"str3"};

我得到的是 a 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  
); 
4

2 回答 2

2

您遇到的主要问题是该数组必须是指向非常量字符的指针数组,但是您正在尝试使用作为常量字符的字符串文字。

您在网上找到的大多数调用此函数的示例都忽略了此问题,因为 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++ 接口的包装类。

于 2020-02-18T03:18:09.220 回答
1

字符串文字是constC++ 中的数据。您不能在不使用类型转换的情况下将指向 const 的指针分配给指向非 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到非常量数组中,如MM 的回答所示。

于 2020-02-18T03:20:57.313 回答