• 0
Авторизация  
Вадим Смоленский

Упаковка всех файлов приложения в appx

Вопросы

В RAD Studio, начиная с Berlin, предусмотрена возможность создавать пакеты appx для загрузки приложений в Microsoft Store. К сожалению, материалов на эту тему пока немного, толковая ссылка нашлась лишь одна:

https://community.embarcadero.com/blogs/entry/appx-development-for-windows-10-store

Там толково объяснено, как создать appx для приложения из одного исполнимого файла. Я попробовал, всё получилось. Но как быть, если пакет должен содержать и другие файлы? В моем случае это файл базы данных, целая папка html-файлов для хелпов, и т.п. Где я должен их указать? Логично было бы предположить, что за это ответственен манифест (Project => Options => Application => Manifest File), который можно кастомизировать. Но сколько я ни гуглил, не смог найти ничего о структуре этого манифеста применительно к файлам. Похоже, манифест здесь все-таки ни при чем.

Раньше я всё это делал в Inno Setup. Как поступать теперь - непонятно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 ответов на этот вопрос

  • 0
5 минут назад, wamaco сказал:

деплой же...

А что деплой? Если вызвать Project => Deploy ... , то молча построится пакет appx, безо всяких дополнительных вопросов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

А-а-а, еще есть Project => Deployment

И там как раз можно добавлять файлы. Не замечал раньше. Попробую...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, wamaco сказал:

Получилось?

Пока не понял. Один файл добавляется легко. Но хотелось бы уметь добавить целую папку со всем ее содержимым, а не расписывать каждый файл отдельно. У меня их там десятки, если не сотни.

Еще не вполне понятна графа "Remote path". Если я хочу, чтобы файл был положен в папку, где по умолчанию будут храниться данные моего приложения (типа <user>\AppData\Roaming\MyApp), то должен быть какой-то макрос для этого дела.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вообще, не могу пока понять, какому принципу должно следовать размещение файлов в приложениях UWP. Раньше я всегда хранил файлы, куда могли писать пользователи, в отдельной папке (AppData), где всегда гарантирован доступ. Теперь же в разных местах (например, здесь) читаю, что приложения UWP имеют доступ к любым файлам. Коли так, то теперь никаких отдельных папок городить и не надо, можно всё валить в одну кучу вместе с исполнимым файлом. Правильно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Вадим Смоленский сказал:

Правильно?

Да

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
6 минут назад, wamaco сказал:

Да

Замечательно! Но правильно ли я понимаю, что UWP-приложение, которое у меня получится, будет работать только под Windows 10, а для пользователей семерок и восьмерок придется держать отдельный дистрибутив?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
24 минуты назад, wamaco сказал:

Совершенно верно!

Благодарю вас за решительный и однозначный ответ!

Последнее, что осталось уяснить: есть ли какой-нибудь способ программным образом узнать из приложения, что оно является UWP-приложением?

Можно было бы, конечно, заложиться на наличие или отсутствие в папке определенных файлов - но пользователи бывают изобретательны на всякую дурость.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Обнаружилась еще одна проблема. Если запаковывать в appx слишком много файлов (у меня было более трехсот - в основном, картинки, используемые в хелпах), то в ходе выполнения процедуры deploy вся среда виснет. Приходится закрывать через Task Manager. Хорошо еще, что я смог снизить количество файлов до двухсот без каких-либо потерь (объединил картинки в блоки), а то не знаю, как бы вышел из положения. Экспериментально установить точную границу поленился - возможно, она равна 256 файлам. Так или иначе, проблема есть, и хорошо было бы от нее в будущем избавиться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

Авторизация  

  • Похожий контент

    • От Вадим Смоленский
      Проект для Windows, автономная БД SQLite, никаких клиент-серверных дел, компоненты и операции самые простые: SQL-запрос в TFDQuery, вызов метода Open. Всё работает нормально, но отдельные пользователи жалуются на эпизодические непредсказуемые падения при поиске. Интересно, что после каждого такого падения всё опять функционирует нормально, но потом приложение не удается нормально закрыть, приходится вызывать диспетчер задач.
      Стабильно воспроизвести не могут ни пользователи, ни я сам. Мне удалось это считанные несколько раз - я лишь смог убедиться через отладчик, что проблема при закрытии связана именно с базой данных: вставлял в обработчик FormCloseQuery оператор TFDConnection.Close - и программа пару раз упала именно на этом операторе.
      Найти корень зла пока не удалось. Показалось только, что проблема возникает лишь тогда, когда поиск приводит к слишком большому (несколько тысяч) числу записей в TFDQuery.
      Может, стоит поменять какие-нибудь установки в TFDConnection или TFDQuery ?
    • От Вадим Смоленский
      Упаковываю свое приложение в appx при помощи кнопки Deploy в Deployment Manager. При этом в разделе Опций "Manifest File" выставлено "Auto Generate". В итоге получается файл AppxManifest.xml; насколько я понимаю, этот манифест также включается в состав итогового пакета appx.
      Пробую загрузить получившийся appx в Microsoft Store. Грузится очень долго и в итоге выдает ошибку: "You don't have permissions to specify the following namespaces in the appx manifest file of the package MyApp.appx: restricted namespace: http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
      В файле AppxManifest.xml действительно отыскивается такой фрагмент. Убираю его, заодно убираю фрагмент  <Capabilities> ... </Capabilities> (если не убрать, получившийся xml даже не отобразится в браузере), переименовываю в MyApp.manifest, меняю установку для манифеста на "Custom", указываю имя. Всё повторяю. Результат ровно тот же.
      Полностью меняю содержимое MyApp.manifest, беря шаблон отсюда. Всё повторяю. Результат опять тот же. Опять магазину не нравится фрагмент манифеста насчет restricted capabilities, которого теперь, по идее, там быть не должно.
      Такое ощущение, что при формировании пакета appx не имеют никакого значения установки по поводу манифеста. Он всегда запихивается в appx в некоем дефолтном варианте, повлиять на который невозможно.
      Или все-таки возможно?
    • От Вадим Смоленский
      При упаковке Windows-приложения в appx все дополнительные файлы приходится класть в одну папку с исполнимым файлом, ибо Deployment Manager, судя по всему, не предусматривает возможности сразу положить их в AppData. Но я все-таки хочу, чтобы некоторые файлы были легко доступны пользователям, поэтому организовал приложение так, что оно при первом запуске создает новый каталог в AppData:
      MyDirectory:=GetSpecialFolderPath(CSIDL_APPDATA)+'\MyApp'; CreateDir(MyDirectory); TDirectory.SetAttributes(MyDirectory,[TFileAttribute.faNormal]); После этого в созданный каталог переносятся некоторые файлы, и всё работает хорошо, за исключением одного момента: этот новый каталог невозможно открыть, например, в Проводнике. Из самого приложения легко можно открыть диалоговое окно и увидеть в нем этот каталог и все файлы; можно их читать и в них писать, но вне приложения этот каталог невидим. Всё равно что не существует.
      Мне казалось, что присвоение каталогу атрибута faNormal дожно все проблемы решить. Увы, не решает. В чем тут закавыка?
    • От Вадим Смоленский
      Устанавливая и запуская свое Windows-приложение, предназначенное для Microsoft Store и запакованное в appx, наткнулся на интересный феномен. Чтобы узнать адрес текущего каталога, я всегда использовал функцию SysUtils.GetCurrentDir. Полученный полный адрес был мне нужен, например, чтобы показывать в TWebBrowser файлы хелпов (относительные адреса там почему-то не прокатывают). Раньше адресом текущего каталога всегда был адрес, где лежит исполнимый файл - условно говоря, C:\Program Files\MyApp. Теперь, когда пакет создается по принципам UWP,  исполнимый файл и прочее хозяйство кладется в каталог C:\Program Files\WindowsApps\MyApp_1.0.0.0_x86__sp51hrchc9zqj.  При этом функция GetCurrentDir почему-то возвращает совершенно другой адрес, а именно C:\WINDOWS\system32. Соответственно, TWebBrowser ничего не показывает.
      Функция SysUtils.GetDir ведет себя так же.
      Как быть?
    • От Вадим Смоленский
      Коллеги! Хотел бы еще раз привлечь ваше внимание к проблеме, недавнее обсуждение которой, к сожалению, заглохло. Не был бы столь настойчив, но это касается всех из нас, кто работает с Windows. Речь о дефекте платформы FMX, выражающемся в том, что щелчок по иконке в панели задач не приводит к сворачиванию приложения, как это задумано. Пользователь sargon предложил следующее решение:
      WM_SYSCOMMAND: begin if wParam = SC_MINIMIZE then PlatformWin.MinimizeApp else if wParam = SC_RESTORE then PlatformWin.RestoreApp; DefWindowProc(HWND, uMsg, wParam, LPARAM); sleep(50); // у FMX какая-то беда с потоками, иногда при нажатии по иконуе приложения в TaskBar окно не сворачивается а снова активируется, sleep уменьшает количество таких глюков Winapi.Windows.SetActiveWindow(FormToHwnd(LForm)); // после разворота активирует окно - проверил в Berlin и Tokyo 10.2.2 end; Фрагмент нужно вставить в FMX.Platform.Win в функцию function WndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
      Я последовал этому совету, но стало только хуже: перестало работать сворачивание даже при щелчке по системной кнопке "Minimize". С щелчком по иконке тоже никаких сдвигов. Что здесь может быть не так?
    • От slav_z
      комп-с нуля. WMPlayer играет видео (mp4) а компонент TMediaPlayer - нет.  Объясните пожалуйста причину.
    • От Вадим Смоленский
      Наткнулся на странное поведение FMX-приложений под Windows. Если развернуть окно приложения на весь экран, потом воспользоваться системной кнопкой "Свернуть все окна" (в правом нижнем углу экрана) и после этого опять вызвать окно приложения, то оно выводится уже не развернутым, а обычным. Появились недовольные таким поведением пользователи. Можно ли их чем-нибудь утешить?
    • От Вадим Смоленский
      Когда мое приложение для Windows компилировалось в Delphi 6, линуксоиды успешно запускали его в Wine. Рапортовали, что неидеально, но работать можно. Теперь, после перевода на FireMonkey, один тестировщик попробовал запустить его в Wine 3.0 и сообщает:
      "Результат неутешителен - программа в нём практически не работает. Интерфейс сломан, кнопки интерфейса не нажимаются (в большинстве; а если и нажимаются, то возникают всякие ошибки)."
      Не сталкивался ли кто-нибудь здесь с этой проблемой? Я тихо надеюсь, что существует некая волшебная кнопка, которая поможет всё наладить.
      Приложение использует FireDAC и SQLite. Сторонних компонентов никаких.
    • От Вадим Смоленский
      Один тестер моего проекта (один изо всей команды!) поставил меня в полный тупик. У него Windows 7, и он запускает приложение на разных компьютерах, выбирая разные темы - то с Aero, то без. Почему-то приложение выглядит у него прилично лишь при запуске с Aero; при запуске же с базовой темой наблюдаются искажения отрисовки и функциональные нарушения. А на одном компьютере с Aero-темой приложение может не запуститься вовсе: например, если установлено системное масштабирование шрифтов 135%. Тогда при запуске появляется сообщение об ошибке в модуле ntdll.dll.
      Не мог бы кто-нибудь разъяснить, как установка темы связана с параметрами Windows API? Можно ли как-то нивелировать эту разницу? На что вообще в таких случаях нужно обратить внимание?
    • От Вадим Смоленский
      Разрабатывая свою софтину, о сенсорных экранах я совсем не думал (отстал от прогресса). Но один тестер сейчас погонял текущую сборку на планшете. Оказалось, что почти всё работает хорошо, но в некоторых местах по нажатию пальцем отрабатывается не OnClick и не OnMouseUp, а почему-то OnMouseMove. Прежде чем изобретать велосипед, хочу спросить у знающих людей: а как вообще лучше организовывать работу с мышью/пальцем, чтобы она одинаково хорошо шла в обоих вариантах? Есть ли здесь четкие рекомендации? Вот, например, я вижу событие OnTap: стоит ли задействовать его? Или это только для мобильных платформ?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу