Что нового?

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

Avangard

Участник
Имеется такая функция. Но она почему-то используется наоборот... То есть возвращается результат 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;

}
}
 

Krinkels

Он где то тут
Администратор
Хех, а зачем двойные кавычки в начале и конце?
 

SotM

Участник
Проверенный
dvd4el, ужасно написана функция! Стиля никакого, читать не возможно!
К тому же, непонятна что эта функция должна вернуть. В описание написано bool, а она ничего не возвращает по определению. И вобще все вопросы о С/С++ лучше вынести в отдельный топик.
 

Krinkels

Он где то тут
Администратор
Я бы написал так:
Код:
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;
}
За работоспособность не ручаюсь, не пробовал
 

DeKaN

Новичок
dvd4el, проще так:
Код:
#include <Dwmapi.h>
#pragma comment(lib, "Dwmapi.lib")

extern "C" {
	BOOL __stdcall isGlassEnabled()
	{
		BOOL isEnabled;
		if (FAILED(DwmIsCompositionEnabled(&isEnabled)))
			isEnabled = FALSE;
		return isEnabled;
	}
}
 

SotM

Участник
Проверенный
DeKaN, хммм, меня смущает что переменная isEnabled принимает значение только FALSE. У меня привычка инициализировать переменные, которые будет возвращать функция. В данном случае я бы написал BOOL isEnabled = TRUE;

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

ProFrager

Знаток
Проверенный
DeKaN, например в winXP этой библиотеки (dwmapi.dll) нет, так что такой код вызовет ошибку. Поэтому тут она и подгружается динамически.

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

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

DeKaN

Новичок
SotM, в WinError.h:
Код:
#define FAILED(hr) (((HRESULT)(hr)) < 0)
Ne0N, не так сложно переделать этот код для динамической загрузки dll
 
Сверху