Ошибки при работе с SystemParametersInfo в Delphi и Pascal на примере SPI_SETDISABLEOVERLAPPEDCONTENT
При работе с функциями операционной системы Windows, разработчики часто сталкиваются с различными проблемами, особенно при использовании функций для изменения системных параметров, таких как SystemParametersInfo. Рассмотрим типичную проблему, связанную с параметром SPI_SETDISABLEOVERLAPPEDCONTENT, и разберемся, как ее можно решить.
Проблема
Разработчик столкнулся с проблемой, при которой после попытки установить значение параметра SPI_SETDISABLEOVERLAPPEDCONTENT в False, при последующем чтении этого параметра через SPI_GETDISABLEOVERLAPPEDCONTENT, значение все еще возвращалось True. Это происходило даже на операционной системе Windows 7, где функция установки параметров возвращала успешный результат.
Анализ кода
При анализе кода, который использовался для установки и чтения параметра SPI_SETDISABLEOVERLAPPEDCONTENT, было выявлено несколько ошибок:
При вызове SystemParametersInfo с параметром SPI_SETDISABLEOVERLAPPEDCONTENT передавался указатель на переменную CAA, а не сама переменная, что не соответствует документации.
Функция GetOSVersion для определения версии операционной системы возвращала некорректные значения для Windows 8 и более поздних версий.
В коде присутствовали ошибки в операторах сравнения, которые могли привести к неправильной работе условия проверки версии операционной системы.
Решение проблемы
Для исправления ошибок в коде, необходимо:
Исправить передачу параметра в SystemParametersInfo, передавая переменную CAA напрямую, без использования указателя.
Использовать функцию CheckWin32Version для проверки версии операционной системы, что избавит от необходимости писать собственную функцию GetOSVersion.
Исправить логику проверки условия, чтобы она корректно обрабатывала версии операционной системы.
Пример исправленного кода
procedure bgSetDisableOverlappedContent(CAA: BOOL);
begin
if CheckWin32Version(6, 0) then
if not SystemParametersInfo(SPI_SETDISABLEOVERLAPPEDCONTENT, 0, CAA, 0) then
RaiseLastOSError;
end;
function bgGetDisableOverlappedContent: BOOL;
var
CAA: BOOL;
begin
if not CheckWin32Version(6, 0) then
begin
Result := FALSE; // Значение по умолчанию, если операционная система не поддерживает функцию
exit;
end;
if not SystemParametersInfo(SPI_GETDISABLEOVERLAPPEDCONTENT, 0, @CAA, 0) then
RaiseLastOSError;
Result := CAA;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
bgSetDisableOverlappedContent(False);
var CAA: BOOL;
bgGetDisableOverlappedContent(CAA); // Получаем текущее значение параметра
ShowMessage(CAA ? 'True' : 'False'); // Показываем результат
end;
Заключение
При работе с системными функциями Windows важно внимательно следить за соответствием типов данных и правильностью их использования. Использование встроенных функций, таких как CheckWin32Version, может значительно упростить код и повысить его надежность.
Описание контекста: В статье рассматривается проблема, связанная с неправильной работой функции `SystemParametersInfo` в Delphi и Pascal, при попытке изменить параметр `SPI_SETDISABLEOVERLAPPEDCONTENT`, и предлагается решение с исправлением выявленных ош
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.