Для публикации приложения, написанного на Delphi, в Windows Store, необходимо соблюдать определённые правила, в том числе и отключать внутренние механизмы обновлений. Согласно политике магазина, такие функции, как "Проверка обновлений", запрещены. В рамках подготовки к публикации, разработчики сталкиваются с необходимостью адаптации кода под требования Универсальной платформы Windows (UWP).
В ходе работы над проектом была найдена C#-функция IsRunningAsUwp(), которая помогает определить, запущено ли приложение в контексте UWP. Планировалось перенести эту функцию в Delphi, однако при попытке выполнения кода в проекте, конвертированном с помощью Desktop Bridge, строка packageFullName оставалась пустой.
Проблема
При попытке использовать функцию GetCurrentPackageFullName для определения запуска приложения в контексте UWP, строка PackageName оставалась пустой, что не позволяло корректно определить, запущено ли приложение в магазине Windows.
Решение
После анализа кода было выявлено, что функция GetCurrentPackageFullName была объявлена неверно. Правильный вариант объявления функции выглядит следующим образом:
function GetCurrentPackageFullName(
out Len: Cardinal;
Name: PWideChar
): Integer; stdcall; external kernel32 delayed;
Вызов функции должен осуществляться следующим образом:
var
Len: Cardinal;
Name: string;
ErrorCode: Integer;
begin
Len := 0;
ErrorCode := GetCurrentPackageFullName(Len, nil);
if ErrorCode <> ERROR_INSUFFICIENT_BUFFER then
RaiseLastOSError(ErrorCode);
SetLength(Name, Len-1);
ErrorCode := GetCurrentPackageFullName(Len, PChar(Name));
if ErrorCode <> ERROR_SUCCESS then
RaiseLastOSError(ErrorCode);
end;
Важно отметить, что в исходном C# коде присутствуют ошибки, которые не были воспроизведены в перенесённой версии на Delphi.
Пример кода
function RunningAsUwp: Boolean;
var
Len, ErrorCode: DWORD;
PackageName: string;
begin
Len := 0;
ErrorCode := GetCurrentPackageFullName(Len, nil);
if ErrorCode <> ERROR_INSUFFICIENT_BUFFER then
RaiseLastOSError(ErrorCode);
SetLength(PackageName, Len);
ErrorCode := GetCurrentPackageFullName(Len, @PackageName[1]);
if ErrorCode <> ERROR_SUCCESS then
RaiseLastOSError(ErrorCode);
Result := ErrorCode <> APPMODEL_ERROR_NO_PACKAGE;
end;
Замечания
Первый вызов функции GetCurrentPackageFullName всегда возвращает код 122 (ERROR_INSUFFICIENT_BUFFER), что является ожидаемым поведением для корректного определения необходимого размера буфера. После корректировки кода проблема была решена.
Выводы
Разработчикам, работающим с публикацией Delphi-приложений в Windows Store, важно внимательно отнестись к деталям работы с UWP и Desktop Bridge, а также корректно адаптировать код для соответствия требованиям магазина. Приведённый пример кода демонстрирует, как можно исправить ошибку с пустой строкой PackageName и обеспечить корректную работу функции определения запуска приложения в магазине Windows.
В процессе адаптации Delphi-приложений для публикации в Windows Store, разработчики сталкиваются с необходимостью тонкой настройки отключения механизмов обновлений и работы с Desktop Bridge для соответствия требованиям магазина.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS