Команды в windows ce

Обновлено: 05.07.2024

Этот пост для настоящих программистов, которые вместо букваря учили алфавит по третьему изданию справочника по C++. Программировать под Windows CE будем на C++ с помощью Embedded Visual C++.

Итак, нам понадобятся:

1. eMbedded Visual C++ 4.0 (TRT7H-KD36T-FRH8D-6QH8P-VFJHQ)
2. eMbedded Visual C++ 4.0 service pack 4
3. ritti.exe
4. Microsoft Pocket PC 2003 SDK.msi
5. Microsoft ActiveSync
6. StandAlone Emulator

Данный комплект позволяет разрабатывать программы, которые запускаются на всех Windows Mobile, начиная с 2003. Забудьте про нововведения в Windows Mobile 5 и 6 (если только они вам не нужны :). Все эти продукты находятся через Гугл, но установить их немного тягомотно. Особенно надоедает Emulator, который требует установки следующих вещей в следующем порядке:

1. netsvwrap.msi
2. standalone_emulator_V1.exe
3. efp.msi
4. emulator_2_0.msi

Если Вы все еще здесь – продолжаем!

Вкратце отличия WinCE API от Win32 API таковы: только Unicode, отсутствие текущего каталога (только абсолютные пути), урезаны громоздкие вещи, наличие особенностей со вводом.

Я создавал кросс-платформенный продукт (под WinCE и Win32). Вот как это делается в двух словах. С помощью UNDER_CE различить платформу:

WinMain немного различается:

_T(«Goodbye, world!»)

_T() есть макрос, которые превратит строковый литерал в UNICODE или ASCII по надобности. Вместо char используем TCHAR.

Чтобы сделать проект UNICODE в Win32 задайте два preprocessor definitions: _UNICODE и UNICODE. В Embedded C++ это будет сделано по умолчанию.

Поскольку нет текущего каталога, все пути абсолютные и самому приходится заботится о добавлении нужного префикса. Вот так найдем откуда нас запустили:

wstring ApplicationPath()
TCHAR Path[MAX_PATH + 1] = ;
int n = GetModuleFileName(0, Path, MAX_PATH);
while (--n > 0 && Path[n] != _T('\\') && Path[n] != _T('/'))
Path[n] = 0;
return Path;
>

Вот так вот извращаемся, если нужно что-то только под Windows 32:

typedef DWORD (WINAPI *FUNC_GetGuiResources)(HANDLE, DWORD);
FUNC_GetGuiResources f_GetGuiResources = 0;

Зато! Зато под Win CE есть все-таки что-то хорошее. Это хорошее – это встроенный в ОС браузер Chro. то есть Oper. то есть Inernet Explorer! Фуу, вспомнил название-таки! Он конечно немного попроще своего старшего брата, но ведь нам много и не нужно – просто красиво нам текст HTML нарисуй и все!

BOOL InitHTMLControl(
HINSTANCE hinst );

Теперича на окно можно добавить контрол с классом WC_HTML.
И заслать в него какой-нибудь HTML для отображения:
SendMessage(hwndHTML, WM_SETTEXT, 0, (LPARAM)"");
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("Hello"));
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("World!"));
SendMessage(hwndHTML, DTM_ENDOFSOURCE, 0, (LPARAM)NULL);

Под Win 32 для схожих целей можно использовать контрол richedit.

Под Win CE нету GetPrivateProfileString, так что чтение и разбор INI-файлов ваша прерогатива.

При загрузке DLL под Win32 имя функции должно быть в ANSI. Хотя проект и под UNICODE. Почему? Потому что!

string ANSI(wstring w)
int l = WideCharToMultiByte(CP_ACP, 0, w.data(), w.size(), NULL, 0, NULL, NULL);
if (l)
char* buffer = new char[l + 1];
l = WideCharToMultiByte(CP_ACP, 0, w.data(), w.size(), buffer, l, NULL, NULL);
buffer[l] = 0;
string s(buffer);
delete[] buffer;
return s;
>
return "";
>

wstring UniCODE(string w)
int l = MultiByteToWideChar(CP_ACP, 0, w.data(), w.size(), NULL, 0);
if (l)
TCHAR* buffer = new TCHAR[l + 1];
l = MultiByteToWideChar(CP_ACP, 0, w.data(), w.size(), buffer, l);
buffer[l] = 0;
wstring s(buffer);
delete[] buffer;
return s;
>
return _T("");
>

Вот как у меня выглядит начало h-файла, который включается в каждый компилируемый файл первым:

Как видите я плотно использую STL и поэтому подгружаю ее классы в пространство имен по умолчанию.

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

Начнём с настройки удаленного подключения(RDP) к серверу с сохранением пароля . По умолчанию возможность сохранить пароль для подключения, чтобы его не вводить каждый раз, отключена .

Что нужно для написания скрипта, его запуска и выполнения?
- Скрипты пишутся в текстовом редакторе. Расширение файла - ".mscr".
- Запускает скрипты программа launcher. Меняем имя этой программы на такое же, как у скрипта. Отличаются расширения.
- Исполняет скрипты программа интерпретатор MortScript, которую нужно положить в каталог со скриптом. ( Документация
по командам и функциям MortScript.) Для исполнения некоторых функций(не для нашего случая) могут понадобиться библиотеки(скиньте, у кого есть под рукой).
Текст скрипта(одна строка), с помощью которого разрешим сохранять пароли для Удаленного подключения:

RegWriteDWord( "HKLM", " Software\Policies\Microsoft\Windows NT\TerminalServices ",

И так теперь при подключении через RDP ставим галку "Сохранить пароль"( Remember my password ).

Ещё раз, для запуска скрипта :
1. Пишем скрипт.
2. Переименовываем имя программы launcher на имя скрипта.
3. Кидаем в одну папку скрипт, launcher.exe и mortScript.exe.
4. Запускаем launcher.

Если нужно, чтобы Удаленный рабочий стол запустился при загрузке операционной системы, добавляем ключ в реестр:

По пути HKEY_LOCAL_MACHINE\init добавляем ключ по шаблону < "Lauch" + число > со значением имени программы Launcher, которая запускает скрипт. Например ключ Launch96 со значением CErunRdp.exe. По поводу назначения имени ключа: рекомендуется(или требуется) устанавливать номера больше 60 ( Launch61, Launch96. ). Значение ключа = имя программы Launcher, совпадающее с именем скрипта(кроме расширения).

или одна строка скрипта:

RegWriteString("HKLM", "init", "Launch96", "CErunRdp.exe")

(Чтоб не затереть другую запись, загляните вначале в реестр.)

Раздел Init в реестре

Русская клавиатура для WinCE.

Может пригодиться кому дополнительная русская клавиатура для WinCE, CyrKeyb.
Инструкция в архиве с программой.

Русская клавиатура CyrKeyb

-------------------------------------------------------------
Чтобы закрыть какую-нибудь программу можно выполнить скрипт:

If(ProcExists("explorer.exe"))
Kill("explorer.exe")
EndIf

If(WndExists("Remote DesktopDisconnected"))
Close("Remote Desktop Disconnected")
EndIf

Консоль для Windows CE
версия 2

Последнее обновление программы в шапке 11.01.10

Прикрепленное изображение

Совместимость: WM 5.0 и WM 6.0

Так как консоль не расчитана на AYG shell то есть некоторые проблемы с кнопкой клавиатуры.
да дерьмо полное ваша Symbolictools PocketConsole.
постоянно глючит. начиная от неправильного вывода на VGA экранах, кончая банальным отказом закрываться.
с MS консолью у меня ни разу не было таких проблем.
ее и использую с PGCC. Системная консоль была бы не лишней и в среде MS Smartphone, имеются ли какие-либо соображения на этот счет?
На HTC Typhoon естественно не работает (WM 2003 SE) .
можно использовать как менеджер файлов в стиле DOS.
также полезна при запуске программ с параметрами. Проблема Symbolictools PocketConsole на VGA разрешилась посредством Force Hi-resolution tool Проблема Symbolictools PocketConsole на VGA разрешилась посредством Force Hi-resolution tool

Спасибо, подозреваю что подробности будут интересны не только мне . :)

в WM2003 SE плохо работает консоль. вводимый текст не отображается.

какая консоль гарантированно хорошо работает под WM2003 SE ?

как в ней вопше путь прописать до файла на карте . я попробувал прописать он постоянно выдаёт file not found народ я понял прога урезаная. чет не пингонуть не могу ни чего. странная реакция на команду cmd /? вроде начинает фака лесть.. а потом хоп и чисто.. есть более лучшие консоли? perlcrowdoll,
Для нормального отображения справки напиши help cmd и будет тебе счастье.
Скажите удалось ли кому-нить настроить вывод ошибок в файл или вывод всего текста в файл.
Что-то мне не удается Крюшон,
Почему ты решил? У меня на трех коммунах работала. Крюшон,
Скрин в шапке сделан как раз на коммуникаторе.

На g900 при установке OutputTo в 0 девайс начинает долго грузится. И не просыпается после сна. К счастью на ключ система реагирует без перезагрузки и можно перед запуском консольной программы менять в 0 а после восстанавливать, но может кто знает решение получше? ничего лучше чем менять ключ скриптом я не умею
От того какая консоль не зависит. Глючит даже при её отсутствии

контейнер приложений Windows CE — это технология, позволяющая большинству приложений CE выполняться на Windows 10 IoT Базовая.

Решение создается в два этапа. на первом этапе создается образ Windows CE 2013 с использованием загрузочного процессора для архитектуры x86 или ARM32. затем на втором этапе этот образ включается в образ Windows 10 IoT Базовая, который использует загрузочный процессор x64 или ARM32 для конкретного оборудования устройства, на котором будет установлено решение.

Архитектура контейнера приложений CE

дополнительные сведения об этой архитектуре см. в этом видео: модернизации Windows CE devices.

Предварительные требования

для контейнер приложений Windows CE программного обеспечения требуется обновленная версия Windows Compact 2013 (сборка с номером 6294 с июня 2020 или более поздней версии) вместе с обновленными пакетами Windows 10 IoT Базовая для x64 и ARM32 (обновление за август 2020 и более поздние версии). чтобы получить последние пакеты для Windows 10 IoT Базовая, обратитесь к своему распространителю майкрософт.

Для распространения устройства, использующего технологию контейнера приложения CE, необходимо иметь действительную подписку на основные службы Интернета вещей .

Кроме того, вам потребуется следующее:

Microsoft Visual Studio 2013 Professional или Visual Studio 2015 Professional. Эти версии необходимы как для построителя приложений, так и для средств платформы Platform Builder.

Platform Builder для Windows Compact 2013

Рабочий загрузочный процессор Интернета вещей Core

не забудьте установить обновленные компоненты вместо компонентов, упоминаемых в этом пошаговом руководству (Windows 10 adk и Windows 10 надстройки PE для интернета вещей, надстройки IoT Core, панель мониторинга Windows 10 IoT Базовая).

настройка, сборка и упаковка CE для контейнер приложений Windows CE

процесс создания Windowsного образа Embedded Compact 2013 не был значительно обновлен. Общий процесс создания образа:

Создание проекта разработки ОС с помощью Platform Builder

Выберите пакет поддержки доски Builder (BSP)

Выберите подходящий шаблон проектирования

Настройка параметров, предоставляемых шаблоном проектирования

При необходимости добавьте подпроекты в проект проекта

Основное изменение заключается в выборе правильного загрузочного процессора и дополнительных соображениях для образа CE. в этом учебнике предполагается, что вы уже знакомы с процессом создания образа системы Windows CE, но в измененном разделе стоит взглянуть на более глубокое рассмотрение.

Шаг 2 является единственной частью предыдущего процесса проекта ОС, который изменяется при использовании контейнера приложения CE. Дополнительные сведения см. ниже.

Шаг 2. Выбор загрузочного процессора Platform Builder

для поддержки контейнер приложений Windows CE в построитель платформ добавлен новый BSP, предназначенный для архитектуры x86 и ARM.

при создании структуры ос для контейнера приложения CE выберите либо "контейнер приложений Windows CE: x86", либо "контейнер приложений Windows CE: ARMv7" (ARM32) в зависимости от базового оборудования для устройства на основе интернета вещей Core.

например, если на целевом устройстве IoT Core используется оборудование Intel, выберите параметр "контейнер приложений Windows CE: x86". кроме того, если оборудование центра интернета вещей использует нксп i. MX6, выберите параметр "контейнер приложений Windows CE: ARMv7".

Выбор загрузочного процессора контейнера приложения CE

после этого у вас будет возможность настроить параметры и подпроекты так же, как и для Windows внедренного компакт-образа. эти конфигурации будут встроены в контейнер CE, который будет развернут в образе Windows 10 IoT Базовая.

создание образа Windows 10 IoT Базовая

этот процесс более подробно рассматривается в лабораторных занятиях, которые являются частью Windows 10 IoT Базовая производственном руководством. В разделе ниже приведены только дополнительные действия, выполняемые на определенных этапах процесса создания образа в центре Интернета вещей. прежде чем продолжить, настоятельно рекомендуется ознакомиться с руководством по производству Windows 10 IoT Базовая.

Общие сведения о процессе

в отличие от процесса создания Windows внедренного образа Compact, Windows 10 IoT Базовая дефрагментации еще интегрирует создание встроенного по, пакетов поддержки плат, определения образа и включения приложения. Используя различные технологии для этих компонентов, можно разделить работу, необходимую для различных команд или отдельных лиц в Организации.

Ниже приведены основные шаги по созданию образа.

Импортируйте созданный ранее контейнер приложения CE

подробные руководства по каждому из этих шагов приведены в составе руководства по производству Windows 10 IoT Базовая. Хотя некоторые из этих шагов подобны процессу использования Platform Builder (PB) для создания образа устройства, стоит изучить некоторые области более глубоко.

Шаг 1. Создание рабочей области

Чтобы узнать, как создать рабочую область, ознакомьтесь с документацией, Создайте базовый образв руководстве по производству центра Интернета вещей Core.

Шаг 2. импорт соответствующего пакета поддержки для основной платы Интернета вещей (BSP)

Ознакомьтесь с документацией, Создайте базовый образв руководстве по производству центра Интернета вещей для поддержки вашей платы.

шаг 3. импорт контейнер приложений Windows CE

контейнер приложений Windows CE создается с помощью инструкции PB, как описано выше, и импортируется в рабочую область центра интернета вещей с помощью команды Import-иотцепал . Эта команда скопирует требуемое содержимое из каталога неструктурированного выпуска CE в рабочую область IoT ADK. Если вызывается несколько раз, предыдущее состояние архивируется в Source-\$Arch\CEPAL.OLD каталоге в рабочей области.

Шаг 4. Создание определения продукта

Чтобы создать определение продукта, ознакомьтесь с документацией, Создайте базовый образв руководстве по производству центра Интернета вещей Core.

Шаг 5. Добавление в продукт контейнера приложения CE

После импорта определения контейнера приложения CE в рабочую область необходимо убедиться в выполнении команды Add-иотцепал , которая добавит ссылку на пакеты контейнеров приложений CE в соответствующий продукт OEMInput.xml файлы (Test и Retail).

Следующим шагом является добавление IOT_CEPAL компонента в OEMInput.xml с помощью команды Add-иотпродуктфеатуре . это добавляет поддержку узла Windows для контейнер приложений Windows CE (Windows CE клиентское приложение UWP и драйверы поддержки) в определение продукта и включает контейнер приложения CE в группу приложений по умолчанию. Мы обсудим конфигурацию запуска в более позднем разделе.

Шаг 6. Создание CAB-файлов

Это важный шаг во время создания ФФУ и должен выполняться при каждом изменении конфигурации, добавлении или изменении приложения или драйверов. Вы будете использовать New-иоткабпаккаже с параметром ALL. Кроме того, при необходимости можно создать отдельные компоненты, но в целом следует перестроить все пакеты до этапа создания ФФУ в качестве рекомендации.

Шаг 7. Развертывание ФФУ на устройстве

После сборки образа его можно развернуть на устройстве. это можно сделать из командной строки с помощью DISM, с помощью процесса развертывания для конкретного устройства или панель мониторинга Windows 10 IoT Базовая. дополнительные сведения можно найти в составе Windows 10 IoT Базовая производственном руководством.

развертывание контейнер приложений Windows CE на устройстве при использовании существующего ффу

Файлы CAB для CE — это развертываемые пакеты в IoT Core. Если имеется образ Интернета вещей Core, эти CAB-файлы можно развернуть на устройстве с помощью APPLYUPDATE команды. Сначала скопируйте CAB на устройство, а затем выполните этап и зафиксируйте CAB с помощью APPLYUPDATE . Обратите внимание, что обновление таким образом учитывает управление версиями пакета, поэтому, если на устройстве развертываются обновленные версии пакетов, они должны иметь более высокий номер версии. (См. команду Set-IoTCabVersion в среде IoT ADK). Дополнительные сведения об этом можно найти в статьях Создание и установка пакетов .

Шаг 8. Создание образа для розничной торговли

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

  • Сертификат подписывания кода розничной торговли
  • Сертификат перекрестной подписи

Правильная подпись и включение приложений

если у вас есть одно или несколько пользовательских приложений, которые необходимо включить в Windows 10 IoT Базоваяный образ розничной торговли, необходимо убедиться, что эти приложения подписываются надлежащим образом при их включении в розничный образ.

Дополнительные сведения

Добавление новых приложений к существующему образу

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

Рекомендации по упаковке

Следует всегда следить за тем, чтобы пакеты были максимально детализированы для сокращения времени обновления.

Так как пакет является наименьшей единицей обновления, убедитесь, что размер каждого пакета максимально мал. При построении в построителе платформ созданные пакеты разделяются в соответствии с разделом памяти, типом модуля или файла в соответствии с автоматическим файлом BIB.

Для пользовательских ресурсов, созданных в Platform Builder и упакованных через Осдесигн. Bib, рассмотрите возможность добавления пользовательских ресурсов в отдельный раздел памяти в BIB (не в NK), чтобы обновления пользовательского кода могли поставляться отдельно от обновлений в ОС CE.

Для пользовательских ресурсов, добавленных с помощью команд пакета IoT ADK: Убедитесь, что созданные пакеты имеют максимально возможный размер.

Добавление других объектов в пакет Platform Builder

Как правило, рекомендуется не изменять полученный пакет, созданный построителем платформ, для включения дополнительных компонентов в образ системы. вместо этого следуйте руководству по производству Windows 10 IoT Базовая. Однако, если файлы необходимо добавить в пакет, созданный с помощью Platform Builder, выполните существующий процесс. При добавлении содержимого в пакет, созданный с помощью PB, учитывайте следующее.

Максимальный размер пакетов (около 400 МБ) и превышение этого размера приведет к невозможности обновления.

Обновления происходят при детализации пакета. Если необходимо обновить один ресурс в пакете, все ресурсы этого пакета будут обновляться одновременно. Чтобы уменьшить размер обновлений, изолируйте содержимое в отдельные пакеты, чтобы свести к минимальному размеру всего обновления.

Добавление дополнительных файлов с помощью Platform Builder

Описанный выше процесс упаковки управляется теми же входными данными, которые приводят к созданию файла-корзины CE. Таким образом, если файлы указываются в Осдесигн. Bib и записи реестра добавляются в Осдесигн. reg, MAKEIMG процесс будет включать эти файлы в полученный CAB-файл. В течение этого процесса MAKEIMG будут доступны следующие действия:

ROMIMAGE создаст каталог с именем CEPAL\_PKG в каталоге неструктурированного выпуска (фрд), который будет служить стадией установленной структуры каталогов для Windows CE для цепал.

ROMIMAGE выполняет инвентаризацию всех файлов CE, которые были размещены на CEPAL\_PKG основе файлов CE BIB.

ROMIMAGE создаст несколько WM.XML файлов для каждого раздела памяти. Это делается для того, чтобы обновления могли быть отправлены более детализированным образом, так как минимальная единица обновления является пакетом.

ROMIMAGE создаст, ссылающийся на все созданные пакеты.

Всем созданным пакетам будет присвоено имя с фиксированным префиксом “%OEM\_NAME%.WindowsCE.\*” , где %OEM\_NAME% заполняется в процессе создания ядра IOT при вызове “%OEM\_NAME%.WindowsCE.\*” . Имя пакета в пространстве имен является производным от раздела Memory в файле BIB (например, NK), за которым следуют модули и файлы (также определяемые файлом BIB).

обмен данными между Windows Embedded Compact 2013 и Windows 10 IoT Базовая приложений

Для обмена данными между приложениями, работающими в контейнере CE, рекомендуется использовать локальный замыкание на себя. Дополнительные сведения о локальном замыкании на себя можно прочитать в этом документе.

Автоматический запуск приложения в контейнере приложения CE

Чтобы автоматически запустить приложение-контейнер CE, можно создать пакет подготовки , который задает для приложения запуска значение "Майкрософт". Windows. IoT.CEPAL.DkMonUWP_cw5n1h2txyewy! Приложение "и включило этот пакет подготовки в образ. Также необходимо удалить приложение, запускаемое по умолчанию, с помощью команды Remove-иотпродуктфеатуре и удалить идентификатор компонента IOT_BERTHA из определения продукта центра Интернета вещей.

доступные параметры конфигурации для контейнер приложений Windows CE

Конфигурация на основе реестра в CE

Неисполняемый стек по умолчанию

по умолчанию в контейнер приложений Windows CE отключены исполняемые страницы стека для повышения безопасности. Однако некоторые устаревшие приложения могут правильно работать с этим поведением. Чтобы включить стек исполняемых файлов, установите следующее значение реестра в образе CE (рекомендуется переходить в Осдесигн. reg в Platform Builder).

16-разрядное переопределение 565 для ГВЕС

если контейнер приложений Windows CE настроена с 32-разрядным дисплеем, то преобразование 16-битных в 32-битные преобразования rgb выполняется гвес. предполагается, что 16-битные пиксельные данные rgb находятся в формате RGB555. Если ресурсы точечного рисунка находятся в 16-разрядной 565 и преобразование в RGB555 этих ресурсов невозможно, поведение преобразования ГВЕС по умолчанию можно изменить с помощью раздела реестра. Создайте следующий раздел реестра:

Настройка на основе реестра в узле (IoT Core)

настройка последовательных портов для контейнер приложений Windows CE

Последовательные порты узла должны быть сопоставлены с средой CE. Это сопоставление существует в реестре центра Интернета вещей Core и должно быть настроено создателем образа.

В разделе HKEY\_CURRENT\_USER\Software\Microsoft\Windows NT\CurrentVersion\CEPAL\Devices\Serial имеются записи конфигурации, позволяющие сопоставлять гостевые COM-порты для размещения COM-портов с помощью следующей схемы.

Если указанный выше путь к реестру не существует при загрузке CE, то конфигурация по умолчанию будет записана на основе обнаруженных последовательных устройств в системе.

Конфигурация на основе файлов в узле

Контейнер CE можно настроить с помощью локального файла на узле C:\WindowsCE\CEEnvConfig.json . Ниже приведен пример этого файла конфигурации.

оемоптионс

Ключ Описание
Графический пользовательский интерфейс Запуск контейнера приложений CE с помощью пользовательского интерфейса (по умолчанию true)
Ширина Ширина экрана для контейнера приложения CE (по умолчанию 1024)
Высота: Высота отображаемого контейнера приложения CE (по умолчанию 768)
филлскрин
Clientareawidth Задает биты по умолчанию на пиксель (по умолчанию 32)
рефрешрате Количество перерисовок отображения в секунду
ноаслрсуппорт Отключает случайный выбор макета адресного пространства в контейнере приложения CE (значение по умолчанию — true)
оемконфигапп Имя семейства пакетов для предоставленного изготовителем оборудования приложения, которое должно быть запущено для настройки.
оемконфигфиле Путь к файлу, содержащему дополнительные параметры конфигурации, общие для Оемконфигапп и контейнера приложения CE

Контейнер приложения CE предоставляет только один сетевой интерфейс, доступный для использования. Если в системе размещения имеется несколько сетевых интерфейсов, необходимо выбрать один из них в реестре узла, чтобы убедиться, что выбранная сетевая карта детерминирована.

Читайте также: