LoadLibrary и ComCtl32.dll
От: Аноним  
Дата: 03.10.13 19:03
Оценка:
Есть простая задача: создать 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 ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.