Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

**Решение проблемы отображения символа авторского права в программах на Pascal в среде с кириллической локалью**

Delphi , Синтаксис , Кодировки

В статье рассмотрим проблему отображения символа авторского права в программах на Pascal, написанных с использованием функций Windows API для работы с информацией о версии файлов. Особое внимание уделим решению данной проблемы в среде с кириллической локалью.

Проблема отображения символа авторского права

Пользователь столкнулся с проблемой, при которой в операционной системе с упрощенным китайским интерфейсом (Simplified Chinese OS) не отображался символ авторского права в информации о версии файла. При этом все остальные тексты отображались корректно. Пример кода, который использовался для получения информации о файле, включал в себя функции GetFileVersionInfo и VerQueryValue. В коде использовались как обычные строки (String), так и строки широкого типа (WideString).

Пример кода

Function CheckFileVerForAppReplaceAlert(Path : String): Boolean;
var
  // ...
begin
  // ...
  TypeStr := 'StringFileInfo' + TransStr + '\' + CInfoStr[5];   //Get The Copyright
  // ...
  if VerQueryValue(VerBuf, PChar(TypeStr), Pointer(Value), VerSize) then
  begin
    NewFileVer := Value;
    // ...
  end;
  // ...
end;

Анализ проблемы

Проблема заключается в некорректной обработке символов, которые не представлены в текущей кодовой странице ANSI. Поскольку используется ANSI-версия Delphi, это приводит к неудачной попытке конвертации из UTF-16 в ANSI.

Решение проблемы

Чтобы решить проблему, необходимо использовать Unicode-версии функций Windows API. Вместо VerQueryValue следует использовать VerQueryValueW, который работает с указателями на массивы WideChar. Для этого в коде следует использовать тип WideString и привести его к PWideChar.

Пример кода с использованием WideString

Function AddWidePathToAppList_Reg(AppPath : WideString): Boolean;
var
  // ...
begin
  Result := False;
  // ...
  if VerQueryValueW(VerBuf, '\VarFileInfo\Translation', Pointer(pTrans), VerSize) then
  begin
    // ...
    for j := Low(CInfoStr) to High(CInfoStr) do
    begin
      TypeStr := 'StringFileInfo' + TransStr + '\' + CInfoStr[j];
      if VerQueryValueW(VerBuf, PWChar(TypeStr), Pointer(Value), VerSize) then
      begin
        // ...
        Result := True;
      end;
    end;
  end;
  // ...
end;

Подтверждение решения

Применение VerQueryValueW и обработка результатов в виде WideString позволяет корректно отображать символы, даже если они не представлены в текущей кодовой странице ANSI. Однако для отображения символов в программе, написанной в ANSI-режиме, потребуется использовать компоненты, поддерживающие Unicode.

Заключение

Проблема отображения символа авторского права в программах на Pascal в среде с кириллической локалью решается путем использования Unicode-версий функций Windows API и обработки результатов в виде широких строк (WideString). Это позволяет корректно работать с символами в формате UTF-16, даже если исходная программа написана в ANSI-режиме.

Создано по материалам из источника по ссылке.

Проблема заключается в некорректном отображении символа авторского права в программах на Pascal из-за несоответствия кодовой страницы при работе с информацией о версии файлов в среде с кириллической локалью, что требует перехода на использование Unicode-


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Кодировки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:06:50/0.005720853805542/1