В ОС Windows кто выполняет вызовы процедур, описанные в msdn

Обновлено: 01.07.2024

Функция обратного вызова, которую вы определяете в своем приложении и которая обрабатывает сообщения, отправленные окну. Тип WNDPROC определяет указатель на эту функцию обратного вызова. Имя WndProc является заполнителем имени функции, которую вы определяете в своем приложении.

Синтаксис

Параметры

Тип: HWND

Дескриптор окна. Этот параметр обычно называется hWnd.

Тип: UINT

Сообщение. Этот параметр обычно называется uMsg.

Списки системных сообщений см. в разделе Системные сообщения.

Тип: WPARAM

Дополнительная информация о сообщении. Этот параметр обычно называется wParam.

Содержимое параметра wParam зависит от значения параметра uMsg.

Тип: LPARAM

Дополнительная информация о сообщении. Этот параметр обычно называется lParam.

Содержимое параметра lParam зависит от значения параметра uMsg.

Возвращаемое значение

Тип: LRESULT

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

Примечания

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

Однако, если ваше приложение работает в 64-разрядной версии операционной системы Windows или WOW64, вы должны знать, что 64-разрядная операционная система обрабатывает неперехваченные исключения по-разному в зависимости от 64-разрядной архитектуры процессора, архитектуры исключений и соглашение о вызовах. В следующей таблице приведены все возможные способы обработки неперехваченных исключений в 64-разрядной операционной системе Windows или WOW64.

Тип поведения Как система обрабатывает необработанные исключения
1< /td> Система подавляет любые необработанные исключения.
2 Система сначала завершает процесс, а затем Помощник по совместимости программ (PCA ) предлагает исправить это при следующем запуске приложения. Вы можете отключить смягчение последствий PCA, добавив раздел «Совместимость» в манифест приложения.
3 Система вызывает фильтры исключений, но подавляет любые неперехваченные исключения, когда он покидает область обратного вызова, не вызывая связанных обработчиков.

В следующей таблице показано, как 64-разрядная версия операционной системы Windows и WOW64 обрабатывает неперехваченные исключения. Обратите внимание, что тип поведения 2 применяется только к 64-разрядной версии операционной системы Windows 7 и более поздних версий.

Операционная система WOW64 64-битная Windows
Windows XP 3 1
Windows Server 2003 3 1
Windows Vista 3 1
Windows Vista SP1 1 1
Windows 7 и более поздние версии 1 2

В Windows 7 с пакетом обновления 1 (32-разрядная, 64-разрядная версия или WOW64) система вызывает фильтр необработанных исключений для обработки исключения перед завершением процесса. Если Помощник по совместимости программ (PCA) включен, он предложит исправить проблему при следующем запуске приложения.

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

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

Функции контроля процесса и среды

< tr> < /tr> < /tr> < tr>
Подпрограмма Использовать
abort Прервать процесс без очистка буферов или вызов функций, зарегистрированных atexit и _onexit
assert Проверка на логическую ошибку
_ASSERT , _ASSERTE макросы Похожи на assert , но доступны только в отладочных версиях библиотек времени выполнения
atexit Запланировать подпрограммы для выполнения при завершении программы
_beginthread , _beginthreadex Создать новый поток в процессе операционной системы Windows
_cexit Выполнить процедуры завершения выхода (такие как очистка буферов), затем вернуть управление вызывающей программе без завершения процесса
_c_exit Выполнить процедуры завершения _exit, затем вернуть управление вызывающей программе без завершения процесса
_cwait Подождать, пока завершится другой процесс
_e ndthread , _endthreadex Завершить поток операционной системы Windows
_execl , _wexecl Выполнить новый процесс со списком аргументов
_execle , _wexecle Выполнить новый процесс со списком аргументов и заданной средой
_execlp , _wexeclp Выполнить новый процесс, используя переменную PATH и список аргументов
_execlpe , _wexeclpe Выполнить новый процесс, используя переменную PATH, заданную среду и список аргументов< /td>
_execv , _wexecv Выполнить новый процесс с массивом аргументов
_execve , _wexecve Выполнить новый процесс с массивом аргументов и заданным окружением
_execvp , _weexecvp Выполнить новый процесс с использованием переменной PATH и массива аргументов
_execvpe , _wexecvpe Выполнить новый процесс, используя переменную PATH, заданную среду и массив аргументов
выход Регистрация функций вызова stered atexit и _onexit , сбросить все буферы, закрыть все открытые файлы и завершить процесс
_exit Немедленно завершить процесс без вызова atexit или _onexit или очистки буферы
getenv , _wgetenv , getenv_s , _wgetenv_s Получить значение переменной окружения
_getpid < /td> Получить идентификационный номер процесса
longjmp Восстановить сохраненную среду стека; использовать его для выполнения нелокального перехода
_onexit запланировать подпрограммы для выполнения при завершении программы; используйте для совместимости с Microsoft C/C++ версии 7.0 и более ранними
_pclose Подождите, пока появится новый командный процессор, и закройте поток на связанном канале
perror , _wperror Вывести сообщение об ошибке
_pipe Создать канал для чтения и записи
_popen , _wpopen Создать канал и выполнить команду
_putenv , _wputenv , _putenv_s , _wputenv_s Добавить или изменить значение переменной среды
поднять Отправить сигнал вызывающему процессу
setjmp Сохранить среду стека; использовать для выполнения нелокального сигнала goto
signal Обработка сигнала прерывания
_spawnl , _wspawnl Создать и выполнить новый процесс с указанным списком аргументов
_spawnle , _wspawnle Создать и выполнить новый процесс с указанным списком аргументов и средой< /td>
_spawnlp , _wspawnlp Создать и выполнить новый процесс, используя переменную PATH и указанный список аргументов
_spawnlpe , _wspawnlpe Создать и выполнить новый процесс, используя переменную PATH, указанную среду и список аргументов
_spawnv , _wspawnv Создать и выполнить новый процесс с указанным массивом аргументов
_spawnve , _wspawnve Создать и выполнить новый процесс с указанным окружением и массивом аргументов
_spawnvp , _wspawnvp Создать и выполнить новый процесс, используя переменную PATH и указанный массив аргументов
_spawnv pe , _wspawnvpe Создать и выполнить новый процесс, используя переменную PATH, указанную среду и массив аргументов
system , _wsystem Execute команда операционной системы

В операционной системе Windows порожденный процесс эквивалентен процессу порождения. Любой процесс может использовать _cwait для ожидания любого другого процесса, для которого известен идентификатор процесса.

Разница между семействами _exec и _spawn заключается в том, что функция _spawn может возвращать управление от нового процесса вызывающему процессу. В функции _spawn и вызывающий процесс, и новый процесс присутствуют в памяти, если не указано _P_OVERLAY.В функции _exec новый процесс перекрывает вызывающий процесс, поэтому управление не может вернуться к вызывающему процессу, если только не произойдет ошибка при попытке начать выполнение нового процесса.

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

Создает новый процесс и его основной поток. Новый процесс запускается в контексте безопасности вызывающего процесса.

Если вызывающий процесс выдает себя за другого пользователя, новый процесс использует токен вызывающего процесса, а не токен олицетворения. Чтобы запустить новый процесс в контексте безопасности пользователя, представленного токеном олицетворения, используйте функцию CreateProcessAsUser или CreateProcessWithLogonW.

Синтаксис

Параметры

[in, необязательно] lpApplicationName

Имя модуля, который нужно выполнить. Этот модуль может быть приложением для Windows. Это может быть модуль другого типа (например, MS-DOS или OS/2), если на локальном компьютере имеется соответствующая подсистема.

В строке может быть указан полный путь и имя файла исполняемого модуля или частичное имя. В случае частичного имени функция использует текущий диск и текущий каталог для завершения спецификации. Функция не будет использовать путь поиска. Этот параметр должен включать расширение имени файла; расширение по умолчанию не предполагается.

Параметр lpApplicationName может иметь значение NULL. В этом случае имя модуля должно быть первым токеном, разделенным пробелами, в строке lpCommandLine. Если вы используете длинное имя файла, содержащее пробел, используйте строки в кавычках, чтобы указать, где заканчивается имя файла и начинаются аргументы; в противном случае имя файла неоднозначно. Например, рассмотрим строку «c:\program files\sub dir\program name». Эта строка может быть интерпретирована несколькими способами. Система пытается интерпретировать возможности в следующем порядке:

  1. c:\program.exe
  2. c:\program files\sub.exe
  3. c:\program files\sub dir\program.exe
  4. c:\program files\sub dir\program name.exe

Если исполняемый модуль представляет собой 16-разрядное приложение, lpApplicationName должно иметь значение NULL, а строка, на которую указывает lpCommandLine, должна указывать исполняемый модуль, а также его аргументы. .

Чтобы запустить пакетный файл, необходимо запустить интерпретатор команд; задайте для lpApplicationName значение cmd.exe и задайте для lpCommandLine следующие аргументы: /c плюс имя пакетного файла.

[вход, выход, необязательно] lpCommandLine

Выполняемая командная строка.

Максимальная длина этой строки составляет 32 767 символов, включая завершающий нулевой символ Unicode. Если lpApplicationName имеет значение NULL, часть имени модуля в lpCommandLine ограничена символами MAX_PATH.

Версия этой функции Unicode, CreateProcessW, может изменять содержимое этой строки. Следовательно, этот параметр не может быть указателем на постоянную память (такую ​​как константная переменная или литеральная строка). Если этот параметр является постоянной строкой, функция может вызвать нарушение прав доступа.

Параметр lpCommandLine может иметь значение NULL. В этом случае функция использует строку, на которую указывает lpApplicationName, в качестве командной строки.

Если и lpApplicationName, и lpCommandLine не равны NULL, строка с завершающим нулем, на которую указывает lpApplicationName, указывает модуль для выполнения, и строка с завершающим нулем, на которую указывает lpCommandLine, определяет командную строку. Новый процесс может использовать GetCommandLine для получения всей командной строки. Консольные процессы, написанные на C, могут использовать аргументы argc и argv для разбора командной строки. Поскольку argv[0] — это имя модуля, программисты на C обычно повторяют имя модуля в качестве первого токена в командной строке.

  1. Каталог, из которого загружено приложение.
  2. Текущий каталог родительского процесса.
  3. Системный каталог 32-разрядной версии Windows. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу.
  4. Системный каталог 16-разрядной версии Windows. Нет функции, которая получает путь к этому каталогу, но он ищется. Имя этого каталога — System.
  5. Каталог Windows.Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.
  6. Каталоги, указанные в переменной среды PATH. Обратите внимание, что эта функция не ищет путь для каждого приложения, указанный в разделе реестра App Paths. Чтобы включить этот путь для каждого приложения в последовательность поиска, используйте функцию ShellExecute.

[in, необязательно] lpProcessAttributes

Указатель на структуру SECURITY_ATTRIBUTES, которая определяет, может ли возвращенный дескриптор нового объекта процесса быть унаследован дочерними процессами. Если lpProcessAttributes имеет значение NULL, дескриптор не может быть унаследован.

Член структуры lpSecurityDescriptor определяет дескриптор безопасности для нового процесса. Если lpProcessAttributes имеет значение NULL или lpSecurityDescriptor имеет значение NULL, процесс получает дескриптор безопасности по умолчанию. ACL в дескрипторе безопасности по умолчанию для процесса исходят из основного токена создателя. Windows XP: ACL в дескрипторе безопасности по умолчанию для процесса исходят из основного токена или токена олицетворения создателя. Это поведение изменилось в Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003.

[in, необязательно] lpThreadAttributes

Указатель на структуру SECURITY_ATTRIBUTES, которая определяет, может ли возвращаемый дескриптор нового объекта потока наследоваться дочерними процессами. Если lpThreadAttributes имеет значение NULL, дескриптор не может быть унаследован.

Член структуры lpSecurityDescriptor определяет дескриптор безопасности для основного потока. Если lpThreadAttributes имеет значение NULL или lpSecurityDescriptor имеет значение NULL, поток получает дескриптор безопасности по умолчанию. ACL в дескрипторе безопасности по умолчанию для потока исходят из токена процесса. Windows XP: ACL в дескрипторе безопасности по умолчанию для потока исходят из основного маркера или маркера олицетворения создателя. Это поведение изменилось в Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003.

Если этот параметр имеет значение TRUE, каждый наследуемый дескриптор в вызывающем процессе наследуется новым процессом. Если параметр равен FALSE, дескрипторы не наследуются. Обратите внимание, что унаследованные дескрипторы имеют то же значение и права доступа, что и исходные дескрипторы. Дополнительные сведения о наследуемых дескрипторах см. в разделе "Примечания".

Службы терминалов: вы не можете наследовать дескрипторы между сеансами. Кроме того, если этот параметр имеет значение TRUE, вы должны создать процесс в том же сеансе, что и вызывающая сторона.

Процессы Protected Process Light (PPL): наследование универсального дескриптора блокируется, когда процесс PPL создает процесс, не относящийся к PPL, поскольку PROCESS_DUP_HANDLE не разрешен для процесса, не относящегося к PPL, к процессу PPL. См. Безопасность процесса и права доступа

Флаги, управляющие классом приоритета и созданием процесса. Список значений см. в разделе Флаги создания процесса.

Этот параметр также управляет классом приоритета нового процесса, который используется для определения приоритетов планирования потоков процесса. Список значений см. в разделе GetPriorityClass. Если ни один из флагов класса приоритета не указан, класс приоритета по умолчанию имеет значение NORMAL_PRIORITY_CLASS, если только класс приоритета процесса создания не равен IDLE_PRIORITY_CLASS или BELOW_NORMAL_PRIORITY_CLASS. В этом случае дочерний процесс получает класс приоритета по умолчанию вызывающего процесса.

Если параметр dwCreationFlags имеет значение 0:

  • Процесс наследует как режим ошибки вызывающего, так и родительскую консоль.
  • Предполагается, что блок среды для нового процесса содержит символы ANSI (дополнительную информацию см. в описании параметра lpEnvironment).
  • 16-разрядное приложение для Windows запускается на общей виртуальной машине DOS (VDM).

[in, необязательно] lpEnvironment

Указатель на блок среды для нового процесса. Если этот параметр имеет значение NULL, новый процесс использует среду вызывающего процесса.

Блок окружения состоит из завершающегося нулем блока строк, завершающихся нулем. Каждая строка имеет следующий вид:

имя=значение\0

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

Блок среды может содержать символы Unicode или ANSI. Если блок среды, на который указывает lpEnvironment, содержит символы Юникода, убедитесь, что dwCreationFlags включает CREATE_UNICODE_ENVIRONMENT. Если этот параметр имеет значение NULL, а блок среды родительского процесса содержит символы Юникода, необходимо также убедиться, что dwCreationFlags включает CREATE_UNICODE_ENVIRONMENT.

В версии ANSI этой функции CreateProcessA завершается сбоем, если общий размер блока среды для процесса превышает 32 767 символов.

Обратите внимание, что блок среды ANSI завершается двумя нулевыми байтами: один для последней строки, еще один для завершения блока.Блок среды Unicode завершается четырьмя нулевыми байтами: двумя для последней строки и еще двумя для завершения блока.

[in, необязательно] lpCurrentDirectory

Полный путь к текущему каталогу процесса. Строка также может указывать путь UNC.

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

Указатель на структуру STARTUPINFO или STARTUPINFOEX.

Чтобы установить расширенные атрибуты, используйте структуру STARTUPINFOEX и укажите EXTENDED_STARTUPINFO_PRESENT в параметре dwCreationFlags.

Дескрипторы в STARTUPINFO или STARTUPINFOEX должны быть закрыты с помощью CloseHandle, когда они больше не нужны.

Важно. Вызывающий объект отвечает за то, чтобы стандартные поля дескрипторов в STARTUPINFO содержали действительные значения дескрипторов. Эти поля копируются без изменений в дочерний процесс без проверки, даже если элемент dwFlags указывает STARTF_USESTDHANDLES. Неправильные значения могут привести к неправильному поведению или сбою дочернего процесса. Используйте средство проверки среды выполнения Application Verifier для обнаружения недействительных дескрипторов.

Указатель на структуру PROCESS_INFORMATION, которая получает идентификационную информацию о новом процессе.

Дескрипторы в PROCESS_INFORMATION должны быть закрыты с помощью CloseHandle, когда они больше не нужны.

Возвращаемое значение

Если функция завершается успешно, возвращаемое значение не равно нулю.

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

Обратите внимание, что функция возвращается до завершения инициализации процесса. Если требуемая DLL не может быть обнаружена или не инициализируется, процесс завершается. Чтобы получить статус завершения процесса, вызовите GetExitCodeProcess.

Примечания

Процессу назначается идентификатор процесса. Идентификатор действителен до завершения процесса. Его можно использовать для идентификации процесса или указать в функции OpenProcess, чтобы открыть дескриптор процесса. Начальному потоку в процессе также назначается идентификатор потока. В функции OpenThread можно указать, чтобы открыть дескриптор потока. Идентификатор действителен до тех пор, пока поток не завершится, и может использоваться для уникальной идентификации потока в системе. Эти идентификаторы возвращаются в структуре PROCESS_INFORMATION.

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

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

Предпочтительный способ завершения процесса — использование функции ExitProcess, поскольку эта функция отправляет уведомление о приближающемся завершении работы всем библиотекам DLL, подключенным к процессу. Другие средства завершения процесса не уведомляют подключенные библиотеки DLL. Обратите внимание, что когда поток вызывает ExitProcess, другие потоки процесса завершаются без возможности выполнить какой-либо дополнительный код (включая код завершения потока подключенных библиотек DLL). Дополнительные сведения см. в разделе Завершение процесса.

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

Если приложение предоставляет блок среды, информация о текущем каталоге системных дисков не распространяется автоматически на новый процесс. Например, есть переменная среды с именем =C:, значением которой является текущий каталог на диске C. Приложение должно вручную передать информацию о текущем каталоге новому процессу. Для этого приложение должно явно создать эти строки переменных среды, отсортировать их по алфавиту (поскольку система использует сортированную среду) и поместить их в блок среды. Как правило, они располагаются в начале блока среды из-за порядка сортировки блоков среды.

Один из способов получить текущую информацию о каталоге для диска X — сделать следующий вызов: GetFullPathName("X:", . ) . Это позволяет приложению не сканировать блок окружения.Если возвращается полный путь X:, нет необходимости передавать это значение в качестве данных среды, поскольку корневой каталог является текущим каталогом по умолчанию для диска X нового процесса.

Когда процесс создается с указанием CREATE_NEW_PROCESS_GROUP, от имени нового процесса выполняется неявный вызов SetConsoleCtrlHandler(NULL,TRUE); это означает, что у нового процесса отключены клавиши CTRL+C. Это позволяет оболочкам самостоятельно обрабатывать CTRL+C и выборочно передавать этот сигнал подпроцессам. CTRL+BREAK не отключен и может использоваться для прерывания процесса/группы процессов.

По умолчанию передача TRUE в качестве значения параметра bInheritHandles приводит к тому, что все наследуемые дескрипторы наследуются новым процессом. Это может быть проблематично для приложений, которые одновременно создают процессы из нескольких потоков, но желают, чтобы каждый процесс наследовал разные дескрипторы. Приложения могут использовать функцию UpdateProcThreadAttributeList с параметром PROC_THREAD_ATTRIBUTE_HANDLE_LIST, чтобы предоставить список дескрипторов, которые должны быть унаследованы конкретным процессом.

Замечания по безопасности

Первый параметр, lpApplicationName, может иметь значение NULL, и в этом случае имя исполняемого файла должно быть в строке с разделителями-пробелами, на которую указывает lpCommandLine. Если в имени исполняемого файла или пути есть пробел, существует риск того, что может быть запущен другой исполняемый файл из-за того, как функция анализирует пробелы. Следующий пример опасен, поскольку функция попытается запустить «Program.exe», если он существует, вместо «MyApp.exe».

Если злоумышленник создаст в системе приложение с именем «Program.exe», любая программа, неправильно вызывающая CreateProcess с использованием каталога Program Files, запустит это приложение вместо предполагаемого приложения.

Чтобы избежать этой проблемы, не передавайте NULL для lpApplicationName. Если вы передаете NULL для lpApplicationName, используйте кавычки вокруг пути к исполняемому файлу в lpCommandLine, как показано в примере ниже.

Примеры

Заголовок processthreadsapi.h определяет CreateProcess как псевдоним, который автоматически выбирает версию этой функции в формате ANSI или Unicode на основе определения константы препроцессора UNICODE. Смешивание использования псевдонима, не зависящего от кодировки, с кодом, который не является нейтральным, может привести к несоответствиям, которые приводят к ошибкам компиляции или выполнения. Дополнительные сведения см. в разделе Соглашения для прототипов функций.

Инструменты RPC создают для пользователей впечатление, что клиент напрямую вызывает процедуру, расположенную в программе удаленного сервера. Клиент и сервер имеют свои собственные адресные пространства; то есть у каждого есть свой собственный ресурс памяти, выделенный для данных, используемых процедурой. На следующем рисунке показана архитектура RPC.

архитектура RPC

Как показано на рисунке, клиентское приложение вызывает локальную процедуру-заглушку вместо фактического кода, реализующего процедуру. Заглушки компилируются и связываются с клиентским приложением. Вместо фактического кода, реализующего удаленную процедуру, клиентский код-заглушка:

  • Получает необходимые параметры из адресного пространства клиента.
  • При необходимости преобразует параметры в стандартный формат отчета о недоставке для передачи по сети.
  • Вызывает функции в библиотеке времени выполнения клиента RPC для отправки запроса и его параметров на сервер.

Сервер выполняет следующие действия для вызова удаленной процедуры.

  1. Функции библиотеки времени выполнения RPC сервера принимают запрос и вызывают процедуру-заглушку сервера.
  2. Заглушка сервера извлекает параметры из сетевого буфера и преобразует их из формата передачи по сети в формат, необходимый серверу.
  3. Серверная заглушка вызывает реальную процедуру на сервере.

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

  1. Удаленная процедура возвращает свои данные серверной заглушке.
  2. Заглушка сервера преобразует выходные параметры в формат, необходимый для передачи по сети, и возвращает их функциям библиотеки времени выполнения RPC.
  3. Функции библиотеки времени выполнения RPC сервера передают данные по сети на клиентский компьютер.

Клиент завершает процесс, принимая данные по сети и возвращая их вызывающей функции.

  1. Клиентская библиотека времени выполнения RPC получает значения, возвращаемые удаленной процедурой, и возвращает их в клиентскую заглушку.
  2. Клиентская заглушка преобразует данные из отчета о недоставке в формат, используемый клиентским компьютером.Заглушка записывает данные в память клиента и возвращает результат вызывающей программе на клиенте.
  3. Процедура вызова продолжается, как если бы процедура была вызвана на том же компьютере.

Библиотеки времени выполнения состоят из двух частей: библиотеки импорта, которая связана с приложением, и библиотеки времени выполнения RPC, реализованной в виде библиотеки динамической компоновки (DLL).

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

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