Есть простая задача: создать progress bar control на главном окне подключив ConCtl32.dll динамически с помощью LoadLibrary().
В сети есть достаточно примеров линковки с ComCtl32.lib и вызовом InitCommonControlEx() через таблицу импорта. Эти примеры прекрасно работают.
Тем не менее, попытки сделать то же самое с помощью LoadLibrary() приводят к тому, что вызов InitCommonControlEx() как будто не регистрирует нужные классы окон, хотя сама функция возвращает TRUE.
Код выглядит так:
INITCOMMONCONTROLSEX initCtrls;
HMODULE lib;
WNDCLASSEX xClass;
typedef VOID (WINAPI *LPFN_INITCOMMONCONTROLS)(VOID);
typedef BOOL (WINAPI *LPFN_INITCOMMONCONTROLSEX)(LPINITCOMMONCONTROLSEX);
LPFN_INITCOMMONCONTROLS InitCommonControlsPtr;
LPFN_INITCOMMONCONTROLSEX InitCommonControlsExPtr;
Check((lib = LoadLibrary(".\\comctl32.dll")) != NULL, "LoadLibrary");
InitCommonControlsPtr = (LPFN_INITCOMMONCONTROLS)GetProcAddress(lib, "InitCommonControls");
Check(InitCommonControlsPtr != NULL, "InitCommonControls");
InitCommonControlsExPtr = (LPFN_INITCOMMONCONTROLSEX)GetProcAddress(lib, "InitCommonControlsEx");
Check(InitCommonControlsExPtr != NULL, "InitCommonControlsEx");
InitCommonControlsPtr();
initCtrls.dwSize = sizeof(initCtrls);
initCtrls.dwICC = (ICC_PROGRESS_CLASS | ICC_BAR_CLASSES | ICC_WIN95_CLASSES);
Check(InitCommonControlsExPtr(&initCtrls), "InitCommonControlsExPtr");
Check(GetClassInfoEx(lib, PROGRESS_CLASS, &xClass), "GetClassInfoEx");
Здесь Check() -- это функция, которая проверяет соблюдение условия (первый аргумент) и генерирует диагностику в случае ошибки.
Последний вызов заканчивается ошибкой с кодом 0x583 ("Класс не существует").
Может быть, есть что-то особенное, что нужно знать о таком способе использования ComCtl32.dll ?