1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Вопрос новичка

Тема в разделе "C/C++", создана пользователем Avangard, 2 окт 2011.

  1. Новичок

    Регистрация:
    26 дек 2011
    Сообщения:
    144
    Симпатии:
    29
    Имеется такая функция. Но она почему-то используется наоборот... То есть возвращается результат false. Правильно работает только через if not.
    bool extern "C" void __stdcall GlassEnabled(void)
    {
    {
    m_hDwmApi = LoadLibraryA("dwmapi.dll");
    if (m_hDwmApi)
    {
    m_pfnDwmIsCompositionEnabled = (DICE)GetProcAddress(m_hDwmApi,"DwmIsCompositionEnabled");
    }

    BOOL DwmIsOn = true;
    m_pfnDwmIsCompositionEnabled(&DwmIsOn);
    if(!DwmIsOn)return;

    }
    }
     
  2. Он где то тут Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    584
    Симпатии:
    346
    Хех, а зачем двойные кавычки в начале и конце?
     
  3. Ветеран Проверенный

    Регистрация:
    15 июн 2011
    Сообщения:
    193
    Симпатии:
    51
    dvd4el, ужасно написана функция! Стиля никакого, читать не возможно!
    К тому же, непонятна что эта функция должна вернуть. В описание написано bool, а она ничего не возвращает по определению. И вобще все вопросы о С/С++ лучше вынести в отдельный топик.
     
  4. Он где то тут Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    584
    Симпатии:
    346
    Я бы написал так:
    Код (Text):
    bool extern "C" void __stdcall GlassEnabled(void)
    {
        m_hDwmApi = LoadLibrary( "dwmapi.dll" );
        if ( !m_hDwmApi )
        {
            MessageBox( NULL, "Ошибка загрузки библиотеки", "Внимание", MB_OK );
            return FALSE;
        }
       
        m_pfnDwmIsCompositionEnabled = ( DICE )GetProcAddress( m_hDwmApi, "DwmIsCompositionEn abled" );
       
        if( !m_pfnDwmIsCompositionEnabled )
        {
            MessageBox( NULL, "Ошибка получения адреса", "Внимание", MB_OK );
            return FALSE;
        }

        BOOL DwmIsOn = true;
        m_pfnDwmIsCompositionEnabled( &DwmIsOn );
        if( !DwmIsOn )
        {
            MessageBox( NULL, "Ошибка m_pfnDwmIsCompositionEnabled", "Внимание", MB_OK );
            return FALSE;
        }
        return TRUE;
    }
    За работоспособность не ручаюсь, не пробовал
     
  5. Старожил

    Регистрация:
    15 июн 2011
    Сообщения:
    19
    Симпатии:
    4
    dvd4el, проще так:
    Код (Text):
    #include <Dwmapi.h>
    #pragma comment(lib, "Dwmapi.lib")

    extern "C" {
        BOOL __stdcall isGlassEnabled()
        {
            BOOL isEnabled;
            if (FAILED(DwmIsCompositionEnabled(&isEnabled)))
                isEnabled = FALSE;
            return isEnabled;
        }
    }
     
  6. Ветеран Проверенный

    Регистрация:
    15 июн 2011
    Сообщения:
    193
    Симпатии:
    51
    DeKaN, хммм, меня смущает что переменная isEnabled принимает значение только FALSE. У меня привычка инициализировать переменные, которые будет возвращать функция. В данном случае я бы написал BOOL isEnabled = TRUE;

    А что енто за хитрый макрос FAILED ? Просто в классическом Си такого нет.
     
  7. Знаток Проверенный

    Регистрация:
    16 июн 2011
    Сообщения:
    321
    Симпатии:
    450
    DeKaN, например в winXP этой библиотеки (dwmapi.dll) нет, так что такой код вызовет ошибку. Поэтому тут она и подгружается динамически.

    Добавлено через 3 минуты
    SotM,
    по идее
    if (FAILED(DwmIsCompositionEnabled(&isEnabled)))
    равнозначно
    if (!DwmIsCompositionEnabled(&isEnabled))

    Добавлено через 1 минуту
    а isEnabled меняет свое значение еще и в DwmIsCompositionEnabled
     
  8. Старожил

    Регистрация:
    15 июн 2011
    Сообщения:
    19
    Симпатии:
    4
    SotM, в WinError.h:
    Код (Text):
    #define FAILED(hr) (((HRESULT)(hr)) < 0)
    Ne0N, не так сложно переделать этот код для динамической загрузки dll
     

Поделиться этой страницей