СВЕДЕНИЯ: интерфейс программ Windows Rundll и Rundll32

Переводы статьи Переводы статьи
Код статьи: 164787 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В состав Microsoft Windows 95, Windows 98 и Windows Millennium Edition (Me) входят программы Rundll.exe и Rundll32.exe. Данные программы представляют собой средства командной строки, позволяющие вызывать функции, экспортируемые из библиотек DLL (16-разрядных и 32-разрядных). Однако Rundll и Rundll32 позволяют вызывать только некоторые функции из некоторых библиотек DLL. Например, с помощью данных программ нельзя вызывать функции Win32 API (Application Programming Interface), экспортируемые системными библиотеками DLL. Эти программы позволяют вызывать функции только из тех библиотек DLL, при разработке которых была реализована подобная возможность. В статье описывается использование программ Rundll и Rundll32 под управлением операционных систем семейства Windows, перечисленных выше.

В состав операционных систем Microsoft Windows NT 4.0, Windows 2000 и Windows XP входит только программа Rundll32. Ни одна из этих операционных систем не поддерживает программу Rundll (данная программа предназначена для платформы Win16).

Программы Rundll и Rundll32 были разработаны корпорацией Майкрософт для использования в пределах корпорации. Но поскольку данные программы предоставляют возможности общего характера, в настоящее время эти программы доступны всем пользователям. В составе Windows NT 4.0 поставляется только программа Rundll32. Программа Rundll данной операционной системой не поддерживается.

Дополнительная информация

Сравнение Rundll и Rundll32

Программа Rundll загружает и выполняет 16-разрядные библиотеки DLL, а Rundll32 — 32-разрядные. Если при запуске программ Rundll и Rundll32 указать в качестве аргумента библиотеку DLL неподдерживаемого типа, программа завершит работу. Сообщение об ошибке при этом не отображается.

Параметры командной строки программы Rundll

Для запуска программы Rundll используется командная строка следующего вида:
   RUNDLL.EXE <имя_библиотеки_dll>, <entrypoint> <необязательные аргументы>
				
Ниже приведен пример команды:
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
При формировании приведенной выше командной строки необходимо учитывать следующее:
  1. Программы Rundll и Rundll32 ищут указанную библиотеку DLL в стандартных местоположениях (документация к функции LoadLibrary() содержит дополнительные сведения). Чтобы убедиться, что будет загружена требуемая библиотека DLL, рекомендуется указывать полный путь к файлу библиотеки. Чтобы избежать включения в имена файлов неподдерживаемых символов, используйте короткие имена файлов. Обратите внимание, что в этом случае следует использовать короткие имена файлов DLL в папке C:\Program Files.
  2. Параметр <имя_библиотеки_dll> не должен содержать пробелов, запятых и кавычек (данное ограничение накладывается анализатором командной строки программы Rundll).
  3. В приведенной выше командной строке чрезвычайно важным является наличие запятой (",") между параметром <имя_библиотеки_dll> и именем функции <entrypoint>. Если запятая пропущена, программы Rundll и Rundll32 завершат работу, не выполняя никаких действий и не отображая никаких сообщений. Кроме того, между параметром <имя_библиотеки_dll>, символом запятой и названием функции <entrypoint> не должно быть пробелов.

Описание работы программы Rundll

После запуска программа Rundll выполняет следующие действия:
  1. Анализирует командную строку.
  2. Загружает указанную библиотеку DLL с помощью функции LoadLibrary().
  3. Получает адрес функции <entrypoint> с помощью функции GetProcAddress().
  4. Вызывает функцию <entrypoint>, передавая ей в качестве аргументов параметры <необязательные аргументы>.
  5. После завершения работы функции <entrypoint> программа Rundll.exe выгружает указанную в командной строке библиотеку DLL и завершает работу.

Создание пользовательской библиотеки DLL

В пользовательскую библиотеку DLL необходимо поместить функцию <entrypoint> со следующим прототипом.

16-разрядные библиотеки DLL

  void FAR PASCAL __loadds
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
32-разрядные библиотеки DLL
  void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
При создании функции EntryPoint необходимо учитывать следующее:
  1. Вместо строки "EntryPoint" необходимо указать фактическое имя функции, являющейся точкой входа. Обратите внимание, что точка входа, используемая программой Rundll32, не зависит от функции DllEntryPoint, которая в 32-разрядных библиотеках DLL осуществляет обработку процессов и оповещение о подключении и отключении потоков.
  2. Функцию, являющуюся точкой входа для программы Rundll32, необходимо определить, используя соглашение о вызовах _stdcall (по умолчанию для атрибута _stdcall используется значение CALLBACK). Если атрибут _stdcall отсутствует, то для функции по умолчанию будет использоваться соглашение о вызовах _cdecl. Это приведет к аварийному завершению работы программы Rundll32 после вызова данной функции.
  3. Вам необходимо определить функцию, используя соглашение о вызовах _stdcall, как описано выше. Из этого следует, что компилятор Visual C++ на самом деле будет экспортировать функцию как _EntryPoint@16, если библиотека DLL написана на языке C, или будет использовать дальнейшие отметки в имени, если библиотека написана на языке C++. Поэтому используйте правильное экспортированное имя в командной строке Rundll или Rundll32. Чтобы избежать применения искаженных имен, используйте файл DEF и экспортируйте функцию, являющуюся точкой входа, по имени. Дополнительную информацию об отметках в именах при использовании компиляторов Visual C++ можно узнать в документации по соответствующему продукту и в следующей статье базы знаний Майкрософт:
    140485 Экспорт символов в стиле языка PASCAL в 32-разрядных библиотеках DLL
Функции, являющейся точкой входа для программы Rundll, передаются следующие параметры.
   hwnd — дескриптор окна, который должен использоваться в качестве окна-владельца для
          любого окна, создаваемого библиотекой DLL
   hinst — дескриптор экземпляра выбранной библиотеки DLL.
   lpszCmdLine — командная строка ASCIIZ, передаваемая библиотеке DLL для проведения анализа.
   nCmdShow — режим отображения окон выбранной библиотеки DLL.
				
Ниже приведен пример команды, запускающей средство Rundll:
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
При выполнении данной команды средство Rundll вызовет функцию InstallHinfSection(), находящуюся в библиотеке Setupx.dll, и передаст ей следующие параметры:
   hwnd = (дескриптор родительского окна)
   hinst = параметр HINSTANCE библиотеки SETUPX.DLL
   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"
   nCmdShow = (данные, передаваемые функции CreateProcess)
				
Обратите внимание, что функция <entrypoint> (или InstallHinfSection() в примере выше) должна выполнять анализ собственной командной строки (см. описание параметра lpszCmdLine) и по необходимости обрабатывать отдельные аргументы. Средство Rundll.exe не анализирует дополнительные аргументы, указываемые в командной строке — эти аргументы должны обрабатываться функцией <entrypoint>.

Различия при использовании Rundll32.exe в Windows 95 и Windows NT

В Windows NT, Windows 2000 и Windows XP поведение средства Rundll32.exe несколько отличается от описанного. Это сделано для корректной обработки командных строк, содержащих символы в формате UNICODE.

Windows NT пытается получить значение GetProcAddress для функции <EntryPoint>W. Если данная точка входа найдена, операционная система считает, что используется следующий прототип:
   void CALLBACK
   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,
               int nCmdShow);
				
Данный прототип аналогичен прототипу ANSI EntryPoint, но в данном прототипе параметр lpszCmdLine содержит строку в формате UNICODE.

Если операционная система не находит функцию <EntryPoint>W, то Windows NT пытается определить значение GetProcAddress для функций <entrypoint>A и <entrypoint>. Если одна из этих функций существует, она будет рассматриваться как точка входа ANSI и будет обрабатываться таким же образом, как в операционных системах Windows 95, Windows 98 и Windows Me. Поэтому, если пользовательская библиотека DLL должна работать в Windows 95 со строками ANSI и в Windows NT/2000/XP со строками UNICODE, необходимо экспортировать функции EntryPointW и EntryPoint. В Windows NT, Windows 2000 и Windows Me будет вызываться функция EntryPointW, которой будет передаваться строка в формате UNICODE, а в Windows 95, Windows 98 и Windows Me — функция EntryPoint, которой будет передаваться строка в формате ANSI.
Примечание. Это ЭКСПРЕСС-ПУБЛИКАЦИЯ, подготовленная непосредственно службой технической поддержки Майкрософт . Сведения, содержащиеся в данном документе, предоставлены в качестве отклика на возникшие проблемы. Из-за срочности в материалах могут быть опечатки, и в любое время и без уведомления в них могут быть внесены изменения. Чтобы получить дополнительные сведения, см. Условия использования.

Свойства

Код статьи: 164787 - Последний отзыв: 30 января 2014 г. - Revision: 1.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Win32 Application Programming Interface на следующих платформах
    • Microsoft Windows 98 Standard Edition
    • операционная система Microsoft Windows Millennium Edition
Ключевые слова: 
kbdll kbFAQ kbinfo kbkernbase kbprogramming kbusage KB164787

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com