BOOL SetupGetInfDriverStoreLocation(
_In_ PCTSTR FileName,
_In_opt_ PSP_ALTPLATFORM_INFO AlternatePlatformInfo,
_In_opt_ PCTSTR LocaleName,
_Out_ PTSTR ReturnBuffer,
_In_ DWORD ReturnBufferSize,
_Out_opt_ PDWORD RequiredSize
);
Как я могу вызвать эту функцию, если у меня есть FileName как:
TCHAR FileName[MAX_VALUE_NAME];
where #define MAX_VALUE_NAME 16383
Это очень распространенный шаблон в Windows API; Вы даете функции буфер и размер буфера (часто в виде количества символов), и вызов завершится ошибкой, если буфер слишком мал.
#define MAX_VALUE_NAME 16383
TCHAR fullpath[MAX_VALUE_NAME];
BOOL result = SetupGetInfDriverStoreLocation(TEXT("NameOfMyFile.inf"), 0, 0, fullpath, MAX_VALUE_NAME, 0);
if (result) MessageBox(0, fullpath, 0, 0);
Ваш буфер очень большой (MSDN говорит: «Максимальный поддерживаемый размер пути — MAX_PATH»), поэтому он должен содержать любой путь .inf, но функция разработана таким образом, что вы можете сначала вызвать его с буфером NULL:
Чтобы определить размер буфера возврата, который должен содержать
полное имя файла указанного INF-файла в драйвере
сохранить, вызвать SetupGetInfDriverStoreLocation и установить ReturnBuffer в
NULL, ReturnBufferSize в ноль и предоставить RequiredSize.
SetupGetInfDriverStoreLocation вернет необходимый размер буфера в
RequiredSize.
Я бы назвал это паттерном «смотреть, распределять, получать». Если есть вероятность, что данные могут действительно измениться, то вы должны вызывать их в цикле, пока вызов get не будет успешным.
Других решений пока нет …