Как портировать программу Windows

Добрый день. Есть один интересный софт на просторах GitHub’а, а именно SteamItemDropIdler . Вкратце расскажу, что это за программа. Она позволяет добывать(drop) предметы из игр в Steam, которые поддерживаю Inventory Service Steam API. Программа простая и хорошо работает, правда только на Windows. Вот её я и попытаюсь портировать на Linux и немного доработать.

Перед нами проект на C++, который использует Open Steamworks. А это значит, что 99% кода точно работать будет без исправлений, проблемой является только введённые Microsoft’ом функции, которые я буду заменять и библиотеки. Меня интересуют функции, имена которых заканчиваются на «_s», а именно: strcpy_s(), sprintf_s().

Первоначально приставки «_s» у них не было, просто Microsoft усовершенствовала безопасность . В данном случае мы просто и элегантно удаляем префиксы по всему проекту. Дальше мы удаляем из проекта введённые Microsoft’ом функции: SetConsoleTitleA().

Так как эта функция просто изменяет заголовок консоли, то я просто выпилю её за ненадобностью. В проекте используется HANDLE для изменения цвета в консоли, его я тоже решил полностью удалить.

Да и к тому же в Linux этого просто напросто нет, так как это уже Win API. Дальше самое интересное, это 2 строки кода с комментарием от разработчика.

Я долго ломал голову над тем, как это работает. На сколько я понял, это вызов функций с передачей в них параметров без заголовочного «.h» файла. И тут началось самое ужасное. Во-первых, надо обновить заголовочный файл от Open Steamworks. Переписать «это» на нормальные вызовы функций и найти в интернете библиотеку от Steam для Linux.

Начал с поисков библиотек, так как без них код не проверить. Убил день на это. Почему же так долго? Потому что это Linux, детка! Для Windows есть один .lib файл и всё, его достаточно, но для Linux их 3:

  • libsteam.a
  • libsteam.so
  • steamclient.so

И главным условие это, что у всех библиотек должна быть одинаковая разрядность, либо х32 или х64. Но я их все нашёл под х64. Отлично, идем дальше.

Теперь надо доработать Open Steamworks. Ищем файл «Interface_OSW.h». В нем мы видим раздел для Linux.

Источник: dzen.ru

Общие рекомендации по переносу

Перенос 32-разрядных приложений в 64-разрядную версию Microsoft Windows будет проще, чем переносить 16-разрядные приложения в 32-разрядные Windows. Тем не менее, этот шаг будет идти более гладко с некоторыми тщательными планированием. Ниже приведены некоторые общие рекомендации.

Планирование

  • Определите величину усилий, необходимых для порта. Определите объем работы, определив следующие элементы:
  • Проблема 32-разрядного кода. Скомпилируйте 32-разрядный код с помощью 64-разрядного компилятора и изучите степень ошибок и предупреждений.
  • Общие компоненты или зависимости. Определите, какие компоненты в приложении происходят из других команд и планирует ли эти команды разрабатывать 64-разрядные версии кода.
  • Устаревший код или код сборки. 16-разрядные приложения на основе Windows не работают на 64-разрядной Windows и должны быть перезаписаны. Хотя код сборки x86 выполняется в WOW64, может потребоваться переписать этот код, чтобы воспользоваться скоростью архитектуры Intel Itanium.
Читайте также:
Какие программы можно отключить в Windows 8 для лучшего быстродействия

Примечание /LARGEADDRESSAWARE:NO игнорируется для двоичного файла ARM64.

Как перенести чувствительность мыши из игры в Windows

Разработка

  • Начните разработку соответствующего кода. Разработчики могут начать писать соответствующий код с помощью последних Windows файлов заголовков и новых типов данных без негативных последствий для 32-разрядной разработки продукта. Дополнительные сведения см. в статье «Подготовка к 64-разрядной Windows».
  • Убедитесь, что код можно скомпилировать для 32-разрядных и 64-разрядных Windows. Новая модель данных была разработана для создания 32-разрядных и 64-разрядных приложений из одной базы кода с небольшим количеством изменений. Команды разработчиков SQL Server и Windows разрабатывают 32-разрядные и 64-разрядные версии своих продуктов из одной базы кода.
  • Используйте новые функции оптимизации компилятора для оптимальной производительности. Оптимизация кода для процессоров Intel Itanium важнее, чем для x86. Компилятор предполагает, что многие функции оптимизации, ранее обрабатываемые микропроцессором. Вы можете максимально повысить производительность 64-разрядного приложения с помощью двух новых функций оптимизации компилятора: профилирования интерактивной оптимизации и оптимизации всей программы. Обе функции приводят к более длительному времени сборки и требуют ранней разработки хороших сценариев тестирования. Интерактивная оптимизация профиля включает двухфакторную компиляцию. Во время первой компиляции код инструментируется для записи поведения выполнения. Эти сведения используются во время второй компиляции для управления всеми функциями оптимизации. Оптимизация всей программы анализирует код во всех файлах приложения, а не только один. Этот подход повышает производительность несколькими способами, включая более эффективную структуру, а также улучшенный анализ побочных эффектов и пользовательские соглашения о вызовах.

Тестирование

  • Определите, будет ли вы тестировать 64-или 32-разрядный код, выполняемый в WOW64. Некоторые приложения включают как собственный 64-разрядный код, так и 32-разрядный код, выполняемый в WOW64. Внимательно изучите это при разработке плана тестирования и определите, должны ли средства тестирования быть 64-разрядными, 32-разрядными или комбинациями. Часто необходимо протестировать 64-разрядные и 32-разрядные версии приложения на 64-разрядной Windows.
  • Тестирование часто используемых 32-разрядных компонентов. Сначала перекомпилируйте код в 64-разрядную и тестовую версию. Во-вторых, устраните проблемы, перекомпилируйте их в 32-разрядных версиях, а затем протестируйте. В-третьих, перекомпиляция до 64-разрядной и тестовой.
  • Тестирование компонентов COM и RPC. Убедитесь, что как 32-разрядные, так и 64-разрядные компоненты COM и RPC правильно взаимодействуют. Кроме того, может потребоваться проверить связь с 16-разрядными компонентами по сети.
  • Протестируйте 32-разрядную версию на 64-разрядной Windows. Клиенты могут продолжать использовать 32-разрядные приложения в 64-разрядной Windows где проблемы с производительностью и памятью не являются основными соображениями.
  • Тестирование различных конфигураций памяти. При добавлении большого объема памяти на сервере иногда возникают ранее незамеченные проблемы в приложении или операционной системе.
Читайте также:
Как убрать программу для открытия файла на Windows 10

Источник: learn.microsoft.com

Портируем C#/XAML приложение Windows 8.1 на UWP

Если ваше приложение Windows 8 или 8.1 небольшое, то вы можете создать новый проект универсального приложения UWP и перенести в него код XAML и C#. Если же приложение содержит достаточный объем кода, то есть другие варианты.

Для того чтобы портировать WinRT C#/XAML приложение Windows 8.x на Windows UWP необходимо изменить манифест и файл проекта. Способа сделать это из среды Visual Studio пока что нет, но можно воспользоваться скриптом, который совершит некоторые автоматические операции, взяв на себя большую часть работы.

Найти скрипт можно по ссылке: GitHub Win10DevGuideMVA / ProjectUpgradeUtility

Оттуда скачиваем 2 файла:
Upgrade_to_uwp.ps1 – сам скрипт
Run_Upgrade_to_uwp.bat — командный файл для того, чтобы запустить скрипт автоматически.

Если захотите сделать все вручную, то можете воспользоваться официальной инструкцией о том, как вручную перенести приложение с Windows 8.1 на универсальную платформу Windows (UWP):
Перенос приложений на универсальную платформу Windows (UWP)

С обновлением файла проекта скрипт справляется на проверку неплохо, а вот про обновление манифеста напишу подробнее.
Можно обновить файл манифеста вручную, добавив некоторым элементам префикс uap:
Следующий код манифеста

MailTo Protocol
MailTo Protocol

Некоторые атрибуты необходимо удалить. Пример:

Из этого кода нам нужно убрать:
ForegroundText=«light»
ToastCapable=«true»
DefaultSize=«square150x150Logo»

Кроме этого нужно изменить размеры тайлов (не забудьте заменить файлы изображений тоже).
В коде манифеста Square30x30Logo заменяем на Square44x44Logo , а Square70x70Logo заменяем на Square71x71Logo .
Например:

Также необходимо удалить все содержимое Prerequisites, включая заглавные теги:

6.3.0 6.3.0

Полный список изменений в манифесте вы найдете на страничке What’s different in Windows 10

Это была теория. Далее я постараюсь описать, как у меня происходил процесс обновления приложения.

Так как у меня 32-ух разрядная система, то в файле скрипта Upgrade_to_uwp.ps1 я изменил 6-ую строчку с
$FolderPath = «C:Program Files (x86)Windows Kits10PlatformsUAP»
на
$FolderPath = «C:Program FilesWindows Kits10PlatformsUAP»

Как правило, по умолчанию PowerShell сконфигурирован на запрет выполнения скриптов. Поэтому необходимо временно разрешить запуск неподписанных скриптов.
Открыв PowerShell с правами администратора я запустил команду
Set-ExecutionPolicy Unrestricted
И установил параметром Y.

Получил вот такой вот отчет

PS D:Porting to Windows 10TesT10TesT> D:Porting to Windows 10TesT10TesTUpgrade_to_uwp.ps1 Converting TesT.csproj. True Недопустимый шаблон регулярного выражения Designer MSBuild:Compile Designer PreserveNewest MSBuild:Compile Designer PreserveNewest MSBuild:Compile Designer PreserveNewest Always PreserveNewest MSBuild:Compile Designer PreserveNewest MSBuild:Compile Designer Designer PreserveNewest MSBuild:Compile Designer MSBuild:Compile Designer . D:Porting to Windows 10TesT10TesTUpgrade_to_uwp.ps1:53 знак:3 + $FileContents = $FileContents -replace «$AppManifestIdentityGroup», . + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: ( . :String) [], RuntimeException + FullyQualifiedErrorId : InvalidRegularExpression Finished updating csproj file Converting Package.appxmanifest. True Finished updating package.appxmanifest Creating project.json. Done

Читайте также:
Как посмотреть температуру процессора Windows 10 без сторонних программ

Запустил PowerShell и вернул значение
Set-ExecutionPolicy Unrestricted
на N.

Как видно из отчета о конвертации, русский текст не был распознан и был заменен на вопросительные знаки.

То есть мне пришлось немного править файл .csproj вручную. Вы же можете чуть-чуть подправить файл Upgrade_to_uwp.ps1 для того чтобы он проводил конвертацию файла .csproj в формате UFT-8. Для этого в строках 21 и 57:
$FileContents | Out-File $FilePath -Encoding ascii -Force
заменяем на
$FileContents | Out-File $FilePath -Encoding utf8 -Force

Кроме того в манифесте остались еще какие-то ошибки, которые также необходимо было исправить.
Что я сделал:

Добавил в манифест Square44x44Logo
Удалил из той же строки:
ToastCapable=«true» и Square30x30Logo=«AssetsSmallLogo.png»

Удалил из манифеста:

.tstf ms-resource:takeatest AssetsLogoOpenFile.png .tstf

Вместо этого кода можно было добавить вручную:

.tstf .tstf

Но я воспользовался графическим редактором манифеста и добавил «объявления» в нем. Пользоваться графическим редактором манифеста стало возможным после того как я удалил из манифеста весь ошибочный код.

Попробовал собрать и получил больше тысячи ошибок. В том числе ошибку:
Couldn’t find the required information in the lock file. Make sure you have UAP,Version=v10.0.10240/win10-anycpu mentioned in your targets.
Так да, ведь тип проекта «Any CPU» на платформе UWP не поддерживается. Типичный ляп. Изменил целевую платформу проекта на x86 и количество ошибок стало приемлемым — всего пара десятков.

В частности были ошибки типа:
Error CS0104 ‘XmlDocument’ is an ambiguous reference between ‘Windows.Data.Xml.Dom.XmlDocument’ and ‘System.Xml.XmlDocument’
Но я довольно быстро исправил все упоминания XmlDocument на Windows.Data.Xml.Dom.XmlDocument.

Кроме того следующий код оказался устаревшим:

SettingsPane.GetForCurrentView().CommandsRequested += OnCommandsRequested; // . void OnCommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args) < try < SettingsCommand sCommand = new SettingsCommand(«SettingsPage», «Settings», new UICommandInvokedHandler(onSettingsCommand)); args.Request.ApplicationCommands.Add(sCommand); SettingsCommand shareQCommand = new SettingsCommand(«ShareQuestion», «Share», new UICommandInvokedHandler(onShareQCommand)); args.Request.ApplicationCommands.Add(shareQCommand); >catch < >> private void onSettingsCommand(IUICommand command) < // . код открывающий FlyOut с настройками >private void onShareQCommand(IUICommand cmd)

Удалив его я получил рабочий проект. Данный функционал придется позднее вернуть иным способом.

После всего этого, соответственно рекомендациям, я добавил в MainPage после this.InitializeComponent(); следующий код, задающий минимальный размер окна, а также предпочитаемый размер приложения при запуске:

public MainPage() < this.InitializeComponent(); ApplicationView.GetForCurrentView().SetPreferredMinSize(new Size < Width = 500, Height = 400 >); ApplicationView.PreferredLaunchViewSize = new Size < Height = 800, Width = 600 >; ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.PreferredLaunchViewSize; >

Оставшаяся часть работы это замена всплывающих элементов FlyOut (на элементы ContentDialog, PopUp или странички с навигацией), работа с кодом который стал deprecated, адаптация кода под различные девайсы с помощью #if и создание гибкого/отзывчивого/заточенного UI, годного под устройства с различными размерами экрана.

  • Разработка под Windows Phone
  • C#
  • Разработка под Windows

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru