Использование DwmIsCompositionEnabled (JwaDwmApi) в предварительной версии вызывает ошибку

Пытался использовать следующий код, чтобы проверить, включен ли 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;

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


person Jeff    schedule 24.09.2011    source источник


Ответы (1)


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

CheckWin32Version(6,0)

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


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

Вероятно, самый простой способ — проверить версию 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, на который вы ссылаетесь.

person David Heffernan    schedule 24.09.2011