Функции в Win32 SDK, которые возвращают данные переменного размера, обычно позволяют пропускать буфер нулевого размера, а затем сообщают вам, сколько места вам понадобится. Они имеют тенденцию выглядеть как одно из следующих (упрощенное):
LSTATUS RegQueryValueExA (HKEY hKey, LPCSTR lpValueName,
LPDWORD lpReserved, LPDWORD lpType,
LPBYTE lpData, LPDWORD lpcbData);
Наивная попытка назвать это может выглядеть так:
DWORD dwType;
DWORD cbData = 0;
LSTATUS status = RegQueryValueEx(hKey, "InstallFolder",
NULL, &dwType,
NULL, &cbData);
BYTE *pData = (BYTE *)malloc(cb);
status = RegQueryValueEx(hKey, "InstallFolder",
NULL, &dwType,
pData, &cbData);
// Do something with pData
Другие функции выглядят следующим образом:
BOOL SetupDiGetClassDescriptionA(CONST GUID *ClassGuid,
PSTR ClassDescription,
DWORD ClassDescriptionSize,
PDWORD RequiredSize);
Мой вопрос: есть ли шаблоны / шаблоны для надежной обработки такого рода функций? Например, если память фактически заканчивается, или размер изменяется между двумя вызовами?