Я пытаюсь вызвать функцию Win32 со следующей сигнатурой:
HRESULT GetDefaultStartupFlags(
[out] DWORD *pdwStartupFlags,
[out, size_is(*pcchHostConfigFile)] LPWSTR pwzHostConfigFile,
[in, out] DWORD *pcchHostConfigFile);
(здесь используется функция)
Я очень смущен, как интерпретировать "LPWSTR", который также является параметром [out]. Означает ли это, что я должен передать LPWSTR, который указывает на предварительно выделенное пространство, которое будет перезаписано? Если это так, как мне интерпретировать директиву "size_is (...)", чтобы узнать, насколько велик буфер, и как вы распределяете пустой WSTR?
Вы можете использовать массив wchar_t
для LPWSTR
(см. http://msdn.microsoft.com/en-us/library/cc230355.aspx)
Распределение как обычно (фиксированный размер или malloc в C/new в C++)
Результатом является путь к файлу, поэтому он будет сохранен как UTF16 (как обычно в Windows).
Последний параметр вашей функции предназначен для передачи выделенной длины.
Как указано в документах, вы можете передать 0, чтобы получить ожидаемый размер
(чтобы выделить достаточно, а затем снова вызвать функцию)
Передача NULL
для второго параметра приводит к возврату требуемого размера в 3-й.
DWORD flgs, sz;
HRESULT hr = GetDefaultStartupFlags(&flgs, NULL, &sz);
if (hr != S_OK) { }
WSTR config[sz]; // or malloc or new ...
hr = GetDefaultStartupFlags(&flgs, config, &sz);
if (hr != S_OK) { }