Да, приложение, которое ссылается на несуществующий экспорт DLL, не сможет загрузиться.
Добавление кода для различных путей в зависимости от версии ОС не очень поможет, потому что у вас все еще будетссылка на несуществующую функцию.
Вместо этого вам необходимо разрешить ссылку во время выполнения.
Один из вариантов - импорт с отложенной загрузкой (с флагом компоновщика /DELAYLOAD
), ноЯ не думаю, что это поддерживается для основных системных библиотек DLL (например, kernel32).
Другой вариант - использовать LoadLibrary
и GetProcAddress
.Код выглядит примерно так, хотя в действительности вы выполняете поиск один раз при запуске приложения, а не каждый раз, когда вызываете функцию.
// Declare type of pointer to CancelIoEx function
typedef BOOL (WINAPI *CancelIoExType)(HANDLE hFile, LPOVERLAPPED lpOverlapped);
// Load module; won't fail because it's already imported
HMODULE hKernel32 = LoadLibrary(L"kernel32.dll");
// Look up function address
CancelIoExType pCancelIoEx = (CancelIoExType)GetProcAddress(hKernel32, "CancelIoEx");
// Do something with it
if (pCancelIoEx)
{
// Function exists so call it
pCancelIoEx(hMyFile, pMyOverlapped);
}
else
{
// Function doesn't exist
}