Использование DwmIsCompositionEnabled (JwaDwmApi) в предварительной версии вызывает ошибку - PullRequest
0 голосов
/ 24 сентября 2011

Попытка использовать следующий код для проверки того, включен ли Windows Aero:

function AeroEnabled: boolean;
var
  enabled: bool;
begin
 // Function from the JwaDwmapi unit (JEDI Windows Api Library)
 DwmIsCompositionEnabled(enabled);
 Result := enabled;

end;

 ...

 if (CheckWin32Version(5,4)) and (AeroEnabled) then
 CampaignTabs.ColorBackground   := clBlack
 else begin
 GlassFrame.Enabled             := False;
 CampaignTabs.ColorBackground   := clWhite;
 end;

Однако, выполнение этого на компьютере с предварительной версией вызывает сбой приложения, посколькуотсутствует.Я также пробовал этот код , однако он производит 2 AV подряд.Как я могу это сделать ?Я использую Delphi 2010.:)

1 Ответ

4 голосов
/ 24 сентября 2011

У вас неверные версии.Сервер Vista / 2008 версии 6.0.Ваш тест должен быть:

CheckWin32Version(6,0)

Я полагаю, что вы используете Delphi 2010 или более позднюю версию, и в этом случае вам следует просто вызвать функцию DwmCompositionEnabled из встроенного модуля Dwmapi.Это организует проверку версии и отложенную привязку для вас.Нет необходимости в JEDI.


Редактировать: Текст ниже был написан до того, как вопрос был отредактирован.

Вероятно, самый простой способ - проверить версию Windows.Вам нужно Win32MajorVersion>=6 (т.е. сервер Vista или 2008) для вызова DwmIsCompositionEnabled.

Если бы вы связывали себя, то вы бы позвонили LoadLibrary с DWMApi.dll, и если это удастся, вы бы позвонили GetProcAddress для связывания.Если это удалось, вы хороши.Но, как я уже сказал, поскольку вы не обрабатываете привязку самостоятельно, проверка версии, вероятно, самая простая.

Таким образом, функция будет выглядеть так:

function AeroEnabled: boolean;
var
  enabled: bool;
begin
  if Win32MajorVersion>=6 then begin
    DwmIsCompositionEnabled(enabled);
    Result := enabled;
  end else begin
    Result := False;
  end;
end;

Обратите внимание, яПредполагая, что ваша библиотека выполняет позднее связывание, то есть явное связывание.Если нет, то вам понадобится LoadLibrary / GetProcAddress, точно так же, как это делается в коде @ RRUZ, на который вы ссылаетесь.

...