Основная проблема, с которой вы сталкиваетесь, состоит в том, что массив должен быть массивом указателей на непостоянные символы, однако вы пытаетесь использовать строковые литералы, которые являются постоянными символами.
Большинство примеров, которые вы можете найти в Интернете вызов этой функции игнорирует эту проблему, потому что компилятор 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);
Код, который вы описали как «Я также пытался:», был бы правильным, но я думаю, вы ошиблись далее в качестве аргумента для GetIDsOfNames вместо arr
ставили &arr
. В программировании COM на C ++ обычная практика - использовать классы-обертки, которые предоставляют более удобный интерфейс C ++ для этих базовых C Win32 API функции.