- Взаимодействие прикладных программ с Windows
- Взаимодействие с операционной системой
- Межпроцессное взаимодействие (IPC) Interprocess communication (IPC)
- Услуги для приложений App services
- COM COM
- Файловая система Filesystem
- броадфилесистемакцесс BroadFileSystemAccess
- публишеркачефолдер PublisherCacheFolder
- шаредакцесссторажеманажер SharedAccessStorageManager
- фуллтрустпроцесслаунчер FullTrustProcessLauncher
- LaunchUriForResultsAsync LaunchUriForResultsAsync
- Замыкание на себя Loopback
- Каналы Pipes
- Реестр Registry
- RPC RPC
- Общая память Shared Memory
Взаимодействие прикладных программ с Windows
При написании программ для многих операционных систем обычно вы исходили из того, что именно ваша программа инициирует взаимодействие с данной операционной системой. Например, в системе DOS программа сама осуществляет запросы на выполнение таких операций, как ввод и вывод информации. Другими словами, программы, написанные «традиционным» способом, сами обращаются к операционной системе, а операционная система после запуска прикладную программу не вызывает. Windows же в значительной степени работает совсем наоборот. Именно Windows осуществляет обращение к прикладным программам. Этот процесс происходит примерно следующим образом. Программа находится в состоянии ожидания до тех пор, пока Windows не пошлет ей сообщение . Сообщение передается прикладной программе посредством специальной функции, которая вызывается самой Windows. После того как сообщение будет принято, предполагается, что прикладная программа должна выполнить соответствующее действие. Хотя в ответ на принятое сообщение прикладная программа может вызвать одну или несколько функций API, тем не менее, именно Windows инициирует всю эту «бурную» деятельность. По сравнению с остальными аспектами, именно механизм взаимодействия с Windows посредством сообщений больше всего определяет общий вид (структуру) всех Windows-программ.
Существует множество разнообразных типов сообщений, которые Windows 2000 может посылать вашей программе. Например, всякий раз, когда выполняется щелчок кнопкой мыши в пределах принадлежащего прикладной программе окна, ей (программе) посылается сообщение о щелчке кнопкой мыши. Другой тип сообщений посылается каждый раз, когда должно быть перерисовано окно, принадлежащее прикладной программе. Кроме того, сообщения иного вида посылаются прикладной программе каждый раз, когда пользователь нажимает клавишу, если приложение сфокусировано на вводе информации. Поэтому необходимо твердо усвоить следующую аксиому: построение прикладной программы должно исходить из предпосылки, что сообщения поступают к ней практически совершенно случайным образом. Вот почему Windows-приложения представляют собой управляемые прерываниями программы. Ведь вы не можете точно предсказать, каким будет следующее сообщение.
Взаимодействие с операционной системой
Взаимодействие с операционными системами (под это понятие по идее попадает и работа с файловой системой) может заключаться в вызове системных команд (shell), запуске внешних для РНР приложений и многом другом, вплоть до взаимодействия с внешними приложениями через СОМ и .NET (на Windows-платформе).
Для выполнения внешних команд и приложений су*цествует множество встроенных функций, которые можно найти в подробной официальной документации. Здесь мы рассмотрим только некоторые из них в качестве примера возможностей РНР
Такие функции бывают полезны для удобного удаленного администрирования Web-сервера через Web-интерфейс или для совместной работы со сторонними приложениями.
Выполнить заданную программу или команду можно, например, с помощью функции exec (). Она запускает заданную программу или команду без вывода ее на экран и возвращает последнюю строку ее выходных данных. Формат записи exec О следующий.
string exec ( string command [, array &output [, int £treturn_var]] )
Здесь параметр command принимает наименование команды или приложения, которое необходимо запустить. Опциональный массив output хранит в себе каждую строку возвращаемого из внешней программы ответа, а return_var может содержать в себе статус выполненной команды.
Например, можно воспользоваться системной функцией Linux uptime, которая сообщает время работы сервера, прошедшее с последней перезагрузки, и некоторую сопутствующую информацию.
В результате выполнения скрипта на экране может появиться строка примерно такого содержания.
00:38:54 up 3:14, 3 users, load average: 0.19, 0.05, 0.01
Похожую строку можно будет увидеть, запустив из консоли Linux команду uptime.
С выполнением данной команды в Windows могут быть проблемы, однако это связано прежде всего с самой командой uptime, так как функция exec () справляется и с запуском приложений под Windows. Вот пример выполнения команды DOS dir.
Здесь все строки вывода при выполнении команды заносятся в массив $dir, а затем выводятся на экран с помощью foreach. При выводе данных на экран необходимо учитывать кодировку, в которой они возвращаются.
Для запуска приложений или команд с автоматическим выводом результатов на экран наиболее подходит функция system (). Ее синтаксис следующий.
string system ( string command [, int Screturn_var] )
Здесь параметр command означает команду, a return_var — контейнер для записи статуса выполнения команды.
С помощью функции system () можно также запускать внешние команды и приложения. Как и было обещано ранее, приводим пример удаления файла в Windows, используя DOS-команду del.
Особенностью данной функции является ее способность к автоматическому выводу результатов выполнения команды на экран. Для вывода на экран листинга текущего каталога можно выполнить следующий код для Linux.
Для того чтобы выполнить системную команду в РНР. не обязательно использовать функции. Зачастую бывает достаточно заключить команду в обратные апострофы, например:
Обратный апостроф на русской раскладке qwerty-клавиатуры находится под клавишей вместе с тильдой (
При работе с системными вызовами необходимо быть предельно внимательными! Выполнение системных команд и запуск внешних программ дает много возможностей для увеличения мощности Web-приложения, однако таит в себе опасность запуска вредоносных программ и команд с необратимыми последствиями.
Особенное внимание следует уделить обработке пользовательского ввода. Этот вопрос уже рассматривался в главе, посвященной обработке форм.
Межпроцессное взаимодействие (IPC) Interprocess communication (IPC)
В этом разделе объясняются различные способы выполнения межпроцессного взаимодействия (IPC) между приложениями универсальная платформа Windows (UWP) и приложениями Win32. This topic explains various ways to perform interprocess communication (IPC) between Universal Windows Platform (UWP) applications and Win32 applications.
Услуги для приложений App services
Службы приложений позволяют приложениям предоставлять службы, которые принимают и возвращают контейнеры свойств примитивов (наборзначений) в фоновом режиме. App services enable applications to expose services that accept and return property bags of primitives (ValueSet) in the background. Объекты с широкими возможностями могут передаваться при сериализации. Rich objects can be passed if they’re serialized.
Службы приложений могут выполнять как фоновые задачи , так и процессы в рамках приложения переднего плана. App services can run either out of process as a background task, or in process within the foreground application.
Службы приложений лучше использовать для совместного использования небольших объемов данных, где задержка почти в реальном времени не требуется. App services are best used for sharing small amounts of data where near real-time latency isn’t required.
COM COM
Com — это распределенная объектно-ориентированная система для создания двоичных программных компонентов, которые могут взаимодействовать и взаимодействовать. COM is a distributed object-oriented system for creating binary software components that can interact and communicate. Как разработчик вы используете COM для создания многократно используемых программных компонентов и слоев автоматизации для приложения. As a developer, you use COM to create reusable software components and automation layers for an application. COM-компоненты могут быть в процессе или вне процесса и могут взаимодействовать через клиентскую и серверную модель. COM components can be in process or out of process, and they can communicate via a client and server model. Необработанные серверы COM долго использовались в качестве средства для обмена данными между объектами. Out-of-process COM servers have long been used as a means for inter-object communication.
Упакованные приложения с возможностью рунфуллтруст могут регистрировать необработанные COM-серверы для IPC с помощью манифеста пакета. Packaged applications with the runFullTrust capability can register out-of-process COM servers for IPC via the package manifest. Это называется упакованным com. This is known as Packaged COM.
Файловая система Filesystem
броадфилесистемакцесс BroadFileSystemAccess
Упакованные приложения могут выполнять IPC, используя обширную файловую систему, объявляя возможность ограничения броадфилесистемакцесс . Packaged applications can perform IPC using the broad filesystem by declaring the broadFileSystemAccess restricted capability. Эта возможность предоставляет интерфейсам Windows. Storage API и API ксксксфромапп Win32 доступ к широкой файловой системе. This capability grants Windows.Storage APIs and xxxFromApp Win32 APIs access to the broad filesystem.
По умолчанию IPC через файловую систему для упакованных приложений ограничена другими механизмами, описанными в этом разделе. By default, IPC via the filesystem for packaged applications is restricted to the other mechanisms described in this section.
публишеркачефолдер PublisherCacheFolder
Публишеркачефолдер позволяет упакованным приложениям объявлять папки в своем манифесте, которые могут использоваться совместно с другими пакетами одним и тем же издателем. The PublisherCacheFolder enables packaged applications to declare folders in their manifest that can be shared with other packages by the same publisher.
Папка общего хранилища имеет следующие требования и ограничения. The shared storage folder has the following requirements and restrictions:
- Данные в папке общего хранилища не архивируются и не перемещаются. Data in the shared storage folder is not backed up or roamed.
- Пользователь может очистить содержимое папки общего хранилища. The user can clear the contents of the shared storage folder.
- Нельзя использовать папку общего хранилища для обмена данными между приложениями разных издателей. You can’t use the shared storage folder to share data among applications from different publishers.
- Нельзя использовать папку общего хранилища для обмена данными между разными пользователями. You can’t use the shared storage folder to share data among different users.
- В папке общего хранилища нет управления версиями. The shared storage folder doesn’t have version management.
Если вы публикуете несколько приложений и ищете простой механизм обмена данными между ними, Публишеркачефолдер является простым параметром на основе файловой системы. If you publish multiple applications and you’re looking for a simple mechanism to share data between them, then the PublisherCacheFolder is a simple filesystem-based option.
шаредакцесссторажеманажер SharedAccessStorageManager
Шаредакцесссторажеманажер используется совместно со службами приложений, активацией протоколов (например, лаунчурифорресултсасинк) и т. д., чтобы совместно использовать сторажефилес через маркеры. SharedAccessStorageManager is used in conjunction with App services, protocol activations (for example, LaunchUriForResultsAsync), etc., to share StorageFiles via tokens.
фуллтрустпроцесслаунчер FullTrustProcessLauncher
Благодаря возможности рунфуллтруст Упакованные приложения могут запускать процессы с полным доверием в одном пакете. With the runFullTrust capability, packaged applications can launch full trust processes within the same package.
В сценариях, где ограничения пакета являются косвенными, или отсутствуют параметры IPC, приложение может использовать процесс полного доверия в качестве прокси-сервера для взаимодействия с системой, а затем IPC с полным уровнем доверия через службы приложений или другой хорошо поддерживаемый механизм IPC. For scenarios where package restrictions are a burden, or IPC options are lacking, an application could use a full trust process as a proxy to interface with the system, and then IPC with the full trust process itself via App services or some other well supported IPC mechanism.
LaunchUriForResultsAsync LaunchUriForResultsAsync
Лаунчурифорресултсасинк используется для простого обмена даннымиValueSetс другими упакованными приложениями, реализующими контракт активации протоколфорресултс . LaunchUriForResultsAsync is used for simple (ValueSet) data exchange with other packaged applications that implement the ProtocolForResults activation contract. В отличие от служб приложений, которые обычно выполняются в фоновом режиме, целевое приложение запускается на переднем плане. Unlike App services, which typically run in the background, the target application is launched in the foreground.
Для совместного использования файлов можно передавать маркеры шаредсторажеакцессманажер в приложение через его значение. Files can be shared by passing SharedStorageAccessManager tokens to the application via the ValueSet.
Замыкание на себя Loopback
Замыкание на себя — это процесс связи с сетевым сервером, который прослушивает localhost (адрес замыкания на себя). Loopback is the process of communicating with a network server listening on localhost (the loopback address).
Для обеспечения безопасности и сетевой изоляции подключения по обратной связи для IPC по умолчанию блокируются для упакованных приложений. To maintain security and network isolation, loopback connections for IPC are blocked by default for packaged applications. Можно включить замыкание соединений между доверенным упакованным приложением с помощью возможностей и свойств манифеста. You can enable loopback connections among trusted packaged application using capabilities and manifest properties.
- Все Упакованные приложения, участвующие в подключениях замыкания на себя, должны объявлять privateNetworkClientServer возможности в манифестах пакетов. All packaged applications participating in loopback connections will need to declare the privateNetworkClientServer capability in their package manifests.
- Два упакованных приложения могут обмениваться данными через замыкание на себя, объявляя лупбаккакцессрулес в манифестах пакетов. Two packaged applications can communicate via loopback by declaring LoopbackAccessRules within their package manifests.
- Каждое приложение должно перечислить в лупбаккакцессрулес. Each application must list the other in its LoopbackAccessRules. Клиент объявляет правило «out» для сервера, а сервер объявляет правила «in» для поддерживаемых клиентов. The client declares an «out» Rule for the server, and the server declares «in» Rules for its supported clients.
Имя семейства пакетов, необходимое для распознавания приложения в этих правилах, можно найти с помощью редактора манифеста пакета в Visual Studio во время разработки, в центре партнеров для приложений, опубликованных с помощью Microsoft Store, или с помощью команды PowerShell Get-AppxPackage для уже установленных приложений. The package family name required to identify an application in these Rules can be found via the package manifest editor in Visual Studio during development time, via Partner Center for applications published through the Microsoft Store, or via the Get-AppxPackage PowerShell command for applications that are already installed.
Неупакованные приложения и службы не имеют удостоверения пакета, поэтому их нельзя объявлять в лупбаккакцессрулес. Unpackaged applications and services don’t have package identity, so they can’t be declared in LoopbackAccessRules. Вы можете настроить упакованное приложение для подключения через замыкание с помощью неупакованных приложений и служб с помощью CheckNetIsolation.exe, однако это возможно только в сценариях загружать неопубликованные или отладки, где у вас есть локальный доступ к компьютеру и у вас есть права администратора. You can configure a packaged application to connect via loopback with unpackaged applications and services via CheckNetIsolation.exe, however this is only possible for sideload or debugging scenarios where you have local access to the machine, and you have administrator privileges.
- Все Упакованные приложения, участвующие в подключениях замыкания на себя, должны объявлять privateNetworkClientServer возможности в манифестах пакетов. All packaged applications participating in loopback connections need to declare the privateNetworkClientServer capability in their package manifests.
- Если упакованное приложение подключается к неупакованному приложению или службе, выполните команду, CheckNetIsolation.exe LoopbackExempt -a -n=
чтобы добавить исключение замыкания на себя для упакованного приложения. If a packaged application is connecting to an unpackaged application or service, run CheckNetIsolation.exe LoopbackExempt -a -n=
to add a loopback exemption for the packaged application.
Если неупакованное приложение или служба подключается к упакованному приложению, выполните команду, CheckNetIsolation.exe LoopbackExempt -is -n=
чтобы позволить упакованному приложению принимать входящие подключения с замыканием на себя. If an unpackaged application or service is connecting to a packaged application, run CheckNetIsolation.exe LoopbackExempt -is -n=
to enable the packaged application to receive inbound loopback connections.
- CheckNetIsolation.exe должны выполняться постоянно, пока упакованное приложение прослушивает подключения. CheckNetIsolation.exe must be running continuously while the packaged application is listening for connections.
- Этот -is флаг появился в Windows 10 версии 1607 (10,0; Сборка 14393). The -is flag was introduced in Windows 10, version 1607 (10.0; Build 14393).
Имя семейства пакетов, необходимое для -n флага CheckNetIsolation.exe , можно найти с помощью редактора манифеста пакета в Visual Studio во время разработки, через Центр партнеров для приложений, опубликованных с помощью Microsoft Store, или с помощью команды PowerShell Get-AppxPackage для уже установленных приложений. The package family name required for the -n flag of CheckNetIsolation.exe can be found via the package manifest editor in Visual Studio during development time, via Partner Center for applications published through the Microsoft Store, or via the Get-AppxPackage PowerShell command for applications that are already installed.
Каналы Pipes
Каналы обеспечивают простое взаимодействие между сервером канала и одним или несколькими клиентами канала. Pipes enable simple communication between a pipe server and one or more pipe clients.
Анонимные каналы и именованные каналы поддерживают следующие ограничения: Anonymous pipes and named pipes are supported with the following constraints:
- По умолчанию именованные каналы в упакованных приложениях поддерживаются только между процессами в одном пакете, если только процесс не имеет полного доверия. By default, named pipes in packaged applications are supported only between processes within the same package, unless a process is full trust.
- Именованные каналы можно совместно использовать в пакетах, следуя рекомендациям по предоставлению общего доступа к именованным объектам. Named pipes can be shared across packages following the guidelines for sharing named objects.
- Именованные каналы в упакованных приложениях должны использовать синтаксис \\.\pipe\LOCAL\ для имени канала. Named pipes in packaged applications must use the syntax \\.\pipe\LOCAL\ for the pipe name.
Реестр Registry
Использование реестра для IPC, как правило, не рекомендуется, но поддерживается для существующего кода. Registry usage for IPC is generally discouraged, but it is supported for existing code. Упакованные приложения имеют доступ только к тем разделам реестра, для доступа к которым у них есть разрешение. Packaged applications can access only registry keys that they have permission to access.
Классические приложения, Упакованные в MSIX, используют виртуализацию реестра , так что глобальные записи реестра содержатся в частном кусте в пакете MSIX. Desktop applications packaged as MSIX leverage registry virtualization such that global registry writes are contained to a private hive within the MSIX package. Это обеспечивает совместимость исходного кода при минимизации влияния на глобальные реестры и может использоваться для IPC между процессами в одном пакете. This enables source code compatibility while minimizing global registry impact, and can be used for IPC between processes in the same package. Если необходимо использовать реестр, то эта модель является предпочтительной, а управление глобальным реестром — с помощью. If you must use the registry, this model is preferred versus manipulating the global registry.
RPC RPC
RPC можно использовать для подключения упакованного приложения к КОНЕЧНОЙ точке RPC Win32 при условии, что Пакетное приложение имеет правильные возможности для сопоставления ACL в КОНЕЧНОЙ точке RPC. RPC can be used to connect a packaged application to a Win32 RPC endpoint, provided that the packaged application has the correct capabilities to match the ACLs on the RPC endpoint.
Пользовательские возможности позволяют производителям оборудования и независимым поставщикам программно определять произвольные возможности, предоставлять им конечные точки RPC, а затем предоставить эти возможности полномочным клиентским приложениям. Custom capabilities enable OEMs and IHVs to define arbitrary capabilities, ACL their RPC endpoints with them, and then grant those capabilities to authorized client applications. Полный пример приложения см. в примере кустомкапабилити . For a full sample application, see the CustomCapability sample.
Конечные точки RPC также могут быть доступен для конкретных упакованных приложений, чтобы ограничить доступ к конечной точке только этими приложениями без необходимости управления дополнительными возможностями. RPC endpoints can also be ACLed to specific packaged applications to limit access to the endpoint to just those applications without requiring the management overhead of custom capabilities. Вы можете использовать API деривеаппконтаинерсидфромаппконтаинернаме для получения идентификатора безопасности из имени семейства пакетов, а затем в списке ACL КОНЕЧНОЙ точки RPC с ИД безопасности, как показано в примере кустомкапабилити . You can use the DeriveAppContainerSidFromAppContainerName API to derive a SID from a package family name, and then ACL the RPC endpoint with the SID as shown in the CustomCapability sample.
Общая память Shared Memory
Сопоставление файлов можно использовать для совместного использования файла или памяти между двумя или более процессами со следующими ограничениями: File mapping can be used to share a file or memory between two or more processes with the following constraints:
- По умолчанию сопоставления файлов в упакованных приложениях поддерживаются только между процессами в одном пакете, если только процесс не имеет полного доверия. By default, file mappings in packaged applications are supported only between processes within the same package, unless a process is full trust.
- Сопоставления файлов можно совместно использовать в пакетах, следуя рекомендациям по предоставлению общего доступа к именованным объектам. File mappings can be shared across packages following the guidelines for sharing named objects.
Для эффективного совместного использования больших объемов данных и управления ими рекомендуется использовать общую память. Shared memory is recommended for efficiently sharing and manipulating large amounts of data.