C windows system32 regsvr32 exe что это

Windows 10 Pro released in July 2015 Windows Vista Enterprise Windows Vista Business Windows Vista Home Basic Windows Vista Home Premium Windows Vista Ultimate Microsoft Windows XP Home Edition Microsoft Windows XP Professional Microsoft Windows XP Tablet PC Edition Windows 7 Enterprise Windows 7 Home Basic Windows 7 Home Premium Windows 7 Professional Windows 7 Ultimate Windows 8 Windows 8 Enterprise Windows 8 Pro Windows 8.1 Windows 8.1 Enterprise Windows 8.1 Pro Еще…Меньше

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

Аннотация

Regsvr32 — это служебная программа командной строки для регистрации и отмены регистрации элементов управления OLE, например ActiveX и библиотеки DLL в реестре Windows. Средство Regsvr32.exe установлено в папке %systemroot%\System32 в ОС Windows XP и более поздних версиях Windows.

Примечание. В 64-разрядных версиях Windows есть две версии файла Regsv32.exe:

  • 64-разрядная версия — %systemroot%\System32\regsvr32.exe;

  • 32-разрядная версия — %systemroot%\SysWoW64\regsvr32.exe.

Синтаксис команды Regsvr32

Программа RegSvr32.exe имеет следующие параметры командной строки.

Regsvr32 [/u] [/n] [/i[:строка_команд]] DLL-файл

/u — отменяет регистрацию сервера

/i — вызывает DllInstall, передавая ей в параметре необязательную строку_команд; при использовании с ключом /u вызывает DllUnInstall.
/n — не вызывает DllRegisterServer; это может использоваться с ключом /i

/s – «тихий» режим; окна сообщений не отображаются

Типичные решения ошибок Regsvr32

При появлении ошибки Regsvr32 попробуйте устранить ее одним из следующих способов.

  • Способ 1. Повторный запуск команды Regsvr32 в командной строке с повышенными привилегиямиЧтобы открыть командную строку с повышенными привилегиями, выполните указанные ниже действия.

    Windows 8.1 и Windows 8Проведите пальцем от правого края экрана к центру и коснитесь кнопки Поиск. Либо, если вы используете мышь, переместите указатель в правый нижний угол экрана и щелкните кнопку Поиск. Введите запрос Командная строка в поле Поиск, щелкните правой кнопкой мыши элемент Командная строка, затем выберите команду Запуск от имени администратора. Если система запросит пароль администратора или подтверждение, введите пароль или нажмите кнопку Разрешить.

    Windows 7 и Windows VistaНажмите кнопку Пуск, введите запрос Командная строка или cmd в поле Поиск, щелкните правой кнопкой мыши элемент Командная строка, а затем выберите команду Запуск от имени администратора. Если система запросит пароль администратора или подтверждение, введите пароль или нажмите кнопку Разрешить.

    Windows XPВойдите в систему в качестве администратора или с другой учетной записью с правами администратора и откройте окно «Командная строка».

  • Способ 2. Использование 32-разрядной версии Regsvr32 для регистрации 32-разрядной библиотеки DLL в 64-разрядной версии ОС WindowsЕсли при регистрации 32-разрядной библиотеки DLL в 64-разрядной версии ОС Windows появляется ошибка, выполните следующие действия.

    1. Откройте командную строку с повышенными привилегиями.

    2. Если 32-разрядная библиотека DLL находится в папке %systemroot%\System32, переместите ее в папку %systemroot%\SysWoW64.

    3. Выполните следующую команду:

      %systemroot%\SysWoW64\regsvr32 <full path of the DLL>

Сообщения об ошибках Regsvr32

В приведенной ниже таблице содержатся сообщения об ошибках RegSvr32 и возможные причины их возникновения.

Сообщение об ошибке

Причина

Недопустимый параметр командной строки «»%1″». Проверьте использование команды и повторите попытку.

Введено недопустимое сочетание параметров командной строки для вызова средства regsvr32.exe.

Эта команда допустима только в том случае, если открыт проект элемента OLE Activex в Microsoft Visual Studio.

Средство Regsvr32.exe вызвано программой Visual Studio, но в командной строке не указано ни одного модуля.

Чтобы зарегистрировать модуль, нужно задать имя двоичного файла.

Средство Regsvr32.exe вызвано без указания модулей в командной строке.

Не удалось выполнить команду OleInitialize. Недостаточно свободной оперативной памяти на этом компьютере. Закройте все открытые программы и повторите попытку.

Средство Regsvr32 должно инициализировать библиотеку COM, прежде чем вызывать ее функции, и отменить инициализацию при завершении работы. Это сообщение об ошибке выводится, если попытка инициализации или ее отмены не были успешными.

Не удалось загрузить модуль «%1».\n\n Проверьте, что двоичный файл хранится на указанном пути или запустите отладку, чтобы диагностировать проблемы с этим двоичным файлом или зависимыми DLL-файлами.\n\n%2.

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

Модуль «%1″ загружен, но точка входа %2 не найдена.\n\nПроверьте, что » %1″ является правильным файлом DLL или OCX и повторите попытку.

Средству Regsvr32.exe не удалось найти необходимую точку входа модуля, указанного в командной строке. Это может произойти при неправильном экспорте точек входа из модуля или если модуль не является DLL- либо OCX-файлом.

Модуль » %1″ загружен, но не удалось выполнить вызов %2, код ошибки: %3.\n\nДля получения дополнительных сведений об этой ошибке выполните поиск в Интернете, указав код ошибки как аргумент поиска.

При вызове средством regsvr32.exe точки входа модуля, указанного в командной строке, произошла ошибка. Код ошибки выводится как часть сообщения.

Возможно, модуль «%1» несовместим с версией Windows, работающей на этом компьютере. Проверьте, совместим ли этот модуль с x86 (32-разрядной) или x64 (64-разрядной) версией regsvr32.exe.

Эта ошибка может произойти, если средство regsvr32.exe запущено на 32-разрядном (x86) компьютере, а в командной строке указан 64-разрядный модуль.

В приведенной ниже таблице содержатся сообщения об ошибках RegSvr32 и возможные причины их возникновения.

Сообщение об ошибке

Причина

Нераспознанный флаг: /неверный_флаг

Введено недопустимое сочетание флагов и ключей.

Не указано имя DLL.

Не введено имя DLL-файла.

Имя_DLL было загружено, но найти точку входа для DllRegisterServer или DllUnregisterServer не удалось.

Файл с указанным именем DLL не является DLL- или OCX-файлом. Например, это сообщение об ошибке будет отображено, если введена команда regsvr32 wjview.exe.

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

Файл с указанным именем DLL не является исполняемым файлом EXE, DLL или OCX. Например, это сообщение об ошибке будет отображено, если введена команда regsvr32 autoexec.bat.

Имя_DLL не поддерживает автоматическую регистрацию, либо в памяти находится поврежденная версия.

Например, при вводе команды «regsvr32 icwdial.dll» будет возвращено это сообщение об ошибке, так как файл Icwdial.dll не регистрируется автоматически. При подозрении на наличие в памяти поврежденной версии файла с указанным именем DLL перезагрузите компьютер или повторно извлеките исходную версию файла.

Ошибка функции OleInitialize (или OleUninitialize)

Средство Regsvr32 должно инициализировать библиотеку COM, прежде чем вызывать ее функции, и отменить инициализацию при завершении работы. Эти сообщения об ошибке возникают, если попытка инициализации библиотеки COM или ее отмены не были успешными. Например, файл Ole32.dll поврежден или является неправильной версией.

Сбой при загрузке библиотеки («Имя_DLL»). GetlastError возвращает ошибку 0x00000485

Winerror.h, 0x00000485 = 1157 (ERROR_DLL_NOT_FOUND). Это означает, что «Не найден один из файлов библиотек, необходимых для выполнения данного приложения». Например, при вводе команды regsvr32 missing.dll будет возвращено это сообщение об ошибке, если файл Missing.dll не найден.

Сбой при загрузке библиотеки («Имя_DLL»). GetLastError возвращает ошибку 0x00000002

Winerror.h, 0x00000002 = 2 (ERROR_FILE_NOT_FOUND). Это означает «Не удается найти указанный файл». Т. е. не найден соответствующий DLL-файл. Например, при вводе команды regsvr32 icwdial.dll будет возвращено это сообщение об ошибке, если файл Tapi32.dll не найден.

Сбой при загрузке библиотеки (dskmaint.dll). GetLastError возвращает ошибку 0x000001f

Winerror.h, 0x000001f = 31 (ERROR_GEN_FAILURE). Это означает «Присоединенное к системе устройство не работает». Это происходит при попытке регистрации файла Win16.dll. Например, это сообщение об ошибке будет отображено, если введена команда regsvr32 dskmaint.dll.

Сбой при загрузке DllRegisterServer (или DllUnregisterServer) в Имя_DLL. Возвращенный код: строка

В файле Winerror.h найдите строку, указанную в сообщении.

Нужна дополнительная помощь?

Нужны дополнительные параметры?

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

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

Windows 10 Pro released in July 2015 Windows Vista Enterprise Windows Vista Business Windows Vista Home Basic Windows Vista Home Premium Windows Vista Ultimate Microsoft Windows XP Home Edition Microsoft Windows XP Professional Microsoft Windows XP Tablet PC Edition Windows 7 Enterprise Windows 7 Home Basic Windows 7 Home Premium Windows 7 Professional Windows 7 Ultimate Windows 8 Windows 8 Enterprise Windows 8 Pro Windows 8.1 Windows 8.1 Enterprise Windows 8.1 Pro More…Less

If this article does not describe the error message that you are receiving, you can obtain detailed error message explanations, recommended actions, and additional support resources from the TechNet Events and Errors page. 

Summary

Regsvr32 is a command-line utility to register and unregister OLE controls, such as DLLs and ActiveX controls in the Windows Registry. Regsvr32.exe is installed in the %systemroot%\System32 folder in Windows XP and later versions of Windows.

Note On a 64-bit version of Windows operating system, there are two versions of the Regsv32.exe file:

  • The 64-bit version is %systemroot%\System32\regsvr32.exe.

  • The 32-bit version is %systemroot%\SysWoW64\regsvr32.exe.

The syntax of the Regsvr32 command

RegSvr32.exe has the following command-line options:

Regsvr32 [/u] [/n] [/i[:cmdline]] <dllname>

/u — Unregister server

/i — Call DllInstall passing it an optional [cmdline]; when it is used with /u, it calls dll uninstall
/n — do not call DllRegisterServer; this option must be used with /i

/s – Silent; display no message boxes

Common solutions for Regsvr32 errors

Try one of the following methods when you receive a Regsvr32 error:

  • Method 1: Re-run the Regsvr32 command from an elevated command promptTo open an elevated command prompt, following these steps:

    Windows 8.1 and Windows 8Swipe in from the right edge of the screen, and then tap Search. Or, if you are using a mouse, point to the lower-right corner of the screen, and then click Search. Type Command Prompt in the Search box, right-click Command Prompt, and then click Run as administrator. If you are prompted for an administrator password or for a confirmation, type the password, or click Allow.

    Windows 7 and Windows VistaClick Start, type Command Prompt or cmd in the Search box, right-click Command Prompt, and then click Run as administrator. If you are prompted for an administrator password or for a confirmation, type the password, or click Allow.

    Windows XPLog on with an administrator account or an account that has administrator permissions, and then open a Command Prompt window.

  • Method 2: Use the 32-bit version of Regsvr32 to register a 32-bit DLL on a 64-bit version of WindowsIf you receive an error when registering a 32-bit DLL on a 64-bit version of Windows, follow these steps:

    1. Open an elevated command prompt.

    2. If the 32-bit DLL is in the %systemroot%\System32 folder, move it to the %systemroot%\SysWoW64 folder.

    3. Run the following command:

      %systemroot%\SysWoW64\regsvr32 <full path of the DLL>

Regsvr32 error messages

The following table contains RegSvr32 error messages and possible causes:

Error message

Cause

The command-flag «»%1″» is not valid. Please review the command usage and try again.

An invalid combination of options was passed in the command line to regsvr32.exe.

This command is only valid if a Microsoft Visual Studio OLE Activex Control project is opened.

Regsvr32.exe was invoked by Visual Studio but no modules were specified in the command line.

To register a module, you must provide a binary name.

Regsvr32.exe was invoked without specifying any modules in the command line.

The command OleInitialize failed to run. Your computer might be low on memory. Close any open programs and then try again.

Regsvr32 must initialize the COM library before it can call needed COM library functions and uninitialize the library when it shuts down. These error messages occur if an attempt to initialize or uninitialize the COM library is unsuccessful.

The module «»%1″» failed to load.\n\n Make sure the binary is stored at the specified path or debug it to check for problems with the binary or dependent .DLL files.\n\n%2.

There was an error in loading a module that was specified in the command line. The error text is displayed as part of the message.

The module «»%1″» was loaded but the entry-point %2 was not found.\n\nMake sure that «»%1″» is a valid DLL or OCX file and then try again

Regsvr32.exe was unable to find the required entry point in the module specified in the command line. This can occur if the entry points are not exported correctly from the module or if the module is not a .DLL or .OCX file.

The module «»%1″» was loaded but the call to %2 failed with error code %3.\n\nFor more information about this problem, search online using the error code as a search term.

There was an error when regsvr32.exe invoked the entry point in the module specified in the command line. The error code is displayed as part of the message.

The module «»%1″» may not compatible with the version of Windows that you’re running. Check if the module is compatible with an x86 (32-bit) or x64 (64-bit) version of regsvr32.exe.

This error can occur, for example, if regsvr32.exe is run on an x86 computer and the module specified in the command line is a 64-bit module.

The following table contains RegSvr32 error messages and possible causes:

Error message

Cause

Unrecognized flag: /invalid_flag

You typed an invalid combination of flags or switches.

No DLL name specified.

You did not include a .dll file name.

Dll_Name was loaded, but the DllRegisterServer or DllUnregisterServer entry point was not found.

The specified Dll name is not a .dll or .ocx file. For example, typing regsvr32 wjview.exe generates this error message.

Dll_Name is not an executable file and no registration helper is registered for this file type.

The specified Dll name is not an executable file (.exe, .dll, or .ocx). For example, typing regsvr32 autoexec.bat generates this error message.

Dll_Name is not self-registerable or a corrupted version is in memory.

For example, typing regsvr32 icwdial.dll returns this error message because the Icwdial.dll file is not self-registerable. If you suspect a corrupted version of Dllname is in memory, try restarting your computer or re-extract the original version of the file.

OleInitialize failed (or OleUninitialize failed)

Regsvr32 must initialize the COM library before it can call needed COM library functions and uninitialize the library when it shuts down. These error messages occur if an attempt to initialize or uninitialize the COM library is unsuccessful. For example, the Ole32.dll file may be corrupted or may be the wrong version.

LoadLibrary(«Dll_Name») failed. GetlastError returns 0x00000485

From Winerror.h, 0x00000485 = 1157 (ERROR_DLL_NOT_FOUND). This means «One of the library files that are needed to run this application cannot be found.» For example, typing regsvr32 missing.dll returns this error message if the Missing.dll file is not found.

LoadLibrary(«Dll_Name») failed. GetLastError returns 0x00000002

From Winerror.h, 0x00000002 = 2 (ERROR_FILE_NOT_FOUND). This means «The system cannot find the file specified.» In other words, a dependent DLL was not found. For example, typing regsvr32 icwdial.dll with Tapi32.dll (a dependency) missing returns this error message..

LoadLibrary(«dskmaint.dll») failed. GetLastError returns 0x000001f

From Winerror.h, 0x000001f = 31 (ERROR_GEN_FAILURE). This means «A device attached to the system is not functioning.» This behavior can occur if you try to register a Win16 .dll file. For example, typing regsvr32 dskmaint.dll returns this error message.

DllRegisterServer (or DllUnregisterServer)in Dll_Name failed. Return code was: string

Search the Winerror.h file for the string that is specified in the message.

Need more help?

Want more options?

Explore subscription benefits, browse training courses, learn how to secure your device, and more.

Communities help you ask and answer questions, give feedback, and hear from experts with rich knowledge.

From Wikipedia, the free encyclopedia

regsvr32

Developer(s) Microsoft, ReactOS Contributors
Initial release February 17, 2000; 23 years ago
Operating system Windows, ReactOS
Platform 32-bit and 64-bit
Type Command
License Windows: Proprietary commercial software
ReactOS: GNU General Public License
Website docs.microsoft.com/en-us/windows-server/administration/windows-commands/regsvr32

In computing, regsvr32 (Register Server) is a command-line utility in Microsoft Windows and ReactOS[1] for registering and unregistering DLLs and ActiveX controls in the operating system Registry.[2] Despite the suffix «32» in the name of the file, there are both 32-bit and 64-bit versions of this utility (with identical names, but in different directories).[3] regsvr32 requires elevated privileges.[4]

To be used with regsvr32, a DLL must export the functions DllRegisterServer and DllUnregisterServer.[5]

The regsvr32 command is comparable to ldconfig in Linux.

Example usage[edit]

regsvr32 shmedia.dll for registering a file

regsvr32 shmedia.dll /s for registering a file without the dialog box ( silent )

regsvr32 /u shmedia.dll for unregistering a file

regsvr32 shmedia.dll /u /s for unregistering a file without the dialog box ( silent )

If another copy of shmedia.dll exists in the system search path, regsvr32 may choose that copy instead of the one in the current directory. This problem can usually be solved by specifying a full path (e.g., c:\windows\system32\shmedia.dll) or using the following syntax:

regsvr32 .\shmedia.dll

References[edit]

  1. ^ «Reactos/Reactos». GitHub. 3 November 2021.
  2. ^ «Regsvr32». TechNet. Microsoft.
  3. ^ How to use the Regsvr32 tool and troubleshoot Regsvr32 error messages:, Microsoft, 14 August 2015. Accessed 2019-02-10.
  4. ^ Regsvr32 — Register a DLL — Windows CMD — SS64.com
  5. ^ «INFO: How Regsvr32.exe Registers and Unregisters COM DLLs». Support. Microsoft. March 24, 2009. Archived from the original on 2015-03-13.

Further reading[edit]

  • John Paul Mueller (2007). Windows Administration at the Command Line for Windows Vista, Windows 2003, Windows XP, and Windows 2000. John Wiley & Sons. ISBN 978-0470165799.
  • Stanek, William R. (2008). Windows Command-Line Administrator’s Pocket Consultant, 2nd Edition. Microsoft Press. ISBN 978-0735622623.

External links[edit]

  • Microsoft TechNet Regsvr32 article
  • Explanation of Regsvr32 Usage and Error Messages
  • C# Frequently Asked Questions: What is the equivalent to regsvr32 in .NET?
  • A free graphical user interface for regsvr32.exe

О LENOVO

+

О LENOVO

  • Наша компания

  • Новости

  • Контакт

  • Соответствие продукта

  • Работа в Lenovo

  • Общедоступное программное обеспечение Lenovo

КУПИТЬ

+

КУПИТЬ

  • Где купить

  • Рекомендованные магазины

  • Стать партнером

Поддержка

+

Поддержка

  • Драйверы и Программное обеспечение

  • Инструкция

  • Инструкция

  • Поиск гарантии

  • Свяжитесь с нами

  • Поддержка хранилища

РЕСУРСЫ

+

РЕСУРСЫ

  • Тренинги

  • Спецификации продуктов ((PSREF)

  • Доступность продукта

  • Информация об окружающей среде

©

Lenovo.

|
|
|
|

Regsvr32 (Microsoft Windows Register Server) — это системная утилита, предназначающаяся для регистрации и отмены регистрации элементов управления ActiveX, компонентов фильтров (кодеков) и компонентов библиотек DLL в системе Windows посредством внесения изменений в реестр.

DLL (Dynamic Link Library, Библиотека Динамической Компоновки) — динамически подключаемый набор подпрограмм (функций), логически объединенных в единый бинарный файл, которые могут быть многократно/одновременно динамически загружены (использованы) различными приложениями, требующими для своего функционирования данные функции.

[краткая] история распределенного кода

Не лишним тут, я думаю, будет познакомиться с историей распределенного кода, что даст нам понимание причин возникновения и развития динамических библиотек. А это, в свою очередь, даст очевидное представление о том, какой функционал несет в себе средство regsvr32 и для чего оно, собственно, предназначается.

Линейное программирование

На заре развития языков программирования, при создании (разработке) программ использовался так называемый линейный подход, который заключался в том, что код писался/выполнялся «сверху-вниз», в четкой последовательности от начала к концу. Но как только человек научился писать код чуть сложнее, чем простой вывод фразы «Hello, World!», перед ним тут же встало несколько проблем, которые показали, что подход имеет очевидные недостатки:

  • исходный код необходимо было копировать из старого проекта в новый;
  • копирование старого кода приводило к ошибкам, путанице, нестыковкам, необходимости исправления и подгонки под новый проект;

Процедуры (функции)

Стояла очевидная проблема разделения, а так же многократного использования кода. Поэтому, по мере развития технологий программирования появилось процедурное (функциональное) программирование, которое было основано на том, что области кода выделялись в отдельные блоки под названием функции (процедуры), к которым имелась возможность многократного обращения (вызова) из любого места программы. Это существенно упростило архитектуру приложения, решило важную проблему дублирующегося кода, поскольку теперь вместо того, чтобы программе использовать повторяющиеся участки кода на протяжении всего процесса выполнения, проще разместить его в отдельной процедуре (функции) и многократно вызывать [по мере необходимости]. Тем не менее, данный подход требовал доработки, поскольку:

  • позволял разделять код программы на логические части лишь в рамках одной языковой среды разработки.

Оверлеи

В условиях дороговизны оперативной памяти и отсутствия у многих операционных систем того времени (MSDOS) механизма виртуализации адресного пространства процесса (виртуальной памяти), обеспечивающего достаточное адресное пространство для приложений, появилась необходимость загружать в ограниченное пространство [дорогой] физической памяти много превосходящие по размеру код/данные приложений. Следствием всего этого явилось разбиение кода/данных программы на обособленные модули, получившие название оверлеев (overlay). Данный механизм непрямую не связан с разделением кода, тем не менее мы о нем упомянем, как о существенной вехе в развитии механизмов разделения кода.

Прерывания

Первой попыткой решения проблемы распределения кода был механизм программных прерываний, который позволял создавать (размещать в микрокоде BIOS) и вызывать сервисы, доступные любым операционным системам и программам. Таблица прерываний включала 255 векторов (адресов), каждый из которых задавал процедуру обслуживания определенного прерывания. Данный сервис мог лешгко программироваться пользователями, то есть любая программа могла [пере]назначить одно из доступных программных прерываний, предоставив, таким образом, общесистемный сервис. И не смотря на все положительные стороны подобного подхода, он имел и ряд серьёзных недостатков:

  • Фиксированное количество сервисов, ограниченное размером таблицы векторов прерываний (255);
  • Отсутствие обработки исключительных ситуаций.
  • Отсутствие системы безопасности;
  • Обособленный синтаксис, несовместимости с синтаксисом языков высокого уровня (необходимость оперировать низкоуровневыми регистрами);
  • Отсутствие контроля типов и корректности данных;

Динамические библиотеки

Дальнейшее развитие данной концепции (а так же развитие ОС) привело к появлению динамически загружаемых библиотек (называемых упрощенно динамическими библиотеками, DLL). Отличительной особенностью было то, что обращение к функционалу этих библиотек могло осуществляться из кода на любых языках и из любых средств разработки [в рамках операционной системы]. На механизме динамических библиотек построен весь программный интерфейс (WinAPI) операционных систем Mirosoft Windows, поэтому любое API, любой сервис, так или иначе базируются на DLL. Характерная особенность динамической библиотеки заключается в том, что она может использоваться сразу несколькими приложениями, а система обеспечивает присутствие в памяти всего-лишь одного экземпляра [кода] динамической библиотеки для всех приложений, которые содержат ссылки на функции данной библиотеки. DLL имели ряд выраженных недостатков:

  • при загрузке динамической библиотеки [в адресное пространство процесса] использовалось лишь её символическое имя, поскольку отсутствовал механизм устойчивой идентификации необходимых библиотек, соответственно:
    • в подгруженной библиотеке [сторонней/не той версии] мог содержаться код, разрушающий структуры данных и кода вызывающего приложения.
    • подгружаемая библиотека [сторонняя/не той версии] могла использовать контекст безопасности основного приложения для получения доступа к ресурсам, к которым в обычных условиях доступа у нее нет.
  • не проверяется информация о типах параметров функции;
  • не проверяется корректность передаваемых параметров функции;

Компонентная объектная модель (COM)

Следующим этапом развития концепции разделяемого кода стало появление компонентной объектной модели (COM, Component Object Model). COM обеспечивал возможность разделять код на отдельные независимые компоненты, которые (в отличие от предыдущих реализаций) подключались уже не по имени файла, а при помощи специального глобального идентификатора (GUID). GUID ни что иное как 128-битный глобальный идентификатор (GUID, Global Unique ID), идентифицирующий конкретный объект класса библиотеки. Каждый компонент определялся [глобально] собственным уникальным идентификатором, и в системе хранилась единая база информации по компонентам, в которой содержалась вся информация: начиная от имени файла, в котором расположен сам компонент, и заканчивая сетевыми настройками. База COM хранится в реестре, в разделе HKEY_CLASSES_ROOT:

  • HKEY_CLASSES_ROOT\CLSID — GUID идентификаторов классов компонентов;
  • HKEY_CLASSES_ROOT\Interface — IID идентификаторов интерфейсов (для реализующих их компонентов);
  • HKEY_CLASSES_ROOT\TypeLib — Информация о файлах, в которых хранятся библиотеки;

Причем сам HKEY_CLASSES_ROOT представляет собой комбинацию разделов HKCU\Software\Classes (для текущего пользователя) и HKLM\Software\Classes (для машины в целом).

Чтобы как-то отличать идентификаторы классов от иных [похожих] системных идентификаторов, применительно к СОМ эти идентификаторы называются идентификаторами класса, и для них используется аббревиатура CLSID.

Примером значения CLSID может служить строка вида {2DB47AE5-CF39-43C2-B4D6-0CD8D90946F4}. В глобальном смысле данные уникальные номера «не повторяются» и уникально идентифицируют компоненты системы, что говорит нам об уникальности объекта класса библиотеки в пределах системы. Подразделами в этих ветках реестра могут быть:

HKCR\CLSID\<GUID>\LocalServer    = <полный путь к 16-битному файлу>

                  LocalServer32  = <полный путь к 32-битному файлу>

                  InprocServer   = <полный путь к 16-битному файлу>

                  InprocServer32 = <полный путь к 32-битному файлу>

То есть параметр (default) этих ключей содержит полный путь к зарегистрированной библиотеке.
Тем не менее в компонентной объектной модели так же присутствовал ряд проблем:

  • COM базируется на динамических библиотеках (в них то и размещаются компоненты). А как мы помним с DLL сохранялась проблема, связанная с совпадением имён файлов библиотек;
  • База данных COM располагается в реестре, и работать с ней предлагалось напрямую, без какого-либо специализированного API. При том, что раздел базы данных является общедоступным, после продолжительной эксплуатации системы он традиционно приходил в рассогласованное состояние (приводящее к множеству системных ошибок).

Сборки (assembly)

Следующая попытка усовершенствовать механизмы распределения кода была предпринята в процессе разработки платформы .NET Framework. В процессе разработки платформы было предложено решение, в основе которого лежат так называемые сборки (assembly), которые являются наименьшими строительными блоками .NET, призванными обеспечить безопасное разделение кода в .NET-приложениях.

Сборка (assembly) — коллекция типов и ресурсов, сгруппированная в один или нескольких файлов для совместного функционирования, образующая логическую функциональную единицу.

Сборка состоит из: манифеста (описывающего сборку), метаданных (описывающих типы), откомпилированного MSIL-кода сборки (.Net-байткод), ресурсов (графика, звуки и прч). Поскольку сборки включают в себя сведения о содержимом, версиях и зависимостях, работоспособность связанных с ними приложений не зависит от внешних источников (таких как реестр). Сборки существенно снижают риск возникновения проблем с библиотеками DLL, а также повышают надежность и простоту развертывания приложений.

Смысл регистрации библиотек и элементов управления

Но, вернемся к нашим библиотекам :)

По какой причине, для использования функций DLL в системе непременно требуется их регистрация? Ответ: чтобы система смогла их найти!!

Казалось бы, ну помести ты DLL в рабочую директорию приложения, и вопрос с нахождением решен. Но ведь библиотеки бывают не только локальными, некоторые из них используются совместно множеством приложений, вот как раз для этой ситуации всё и затевалось!! Я думаю, вполне уместно было бы привести аналогию с системной переменной пути (%PATH%). Как Вы помните, файлы, которые располагаются в директориях, указанных в переменной %PATH%, можно запускать из командной строки без указания полного пути. В случае же отсутствия директорий в переменной %PATH%, указанные файлы невозможно будет запустить из произвольного местоположения в операционной системе, командный интерпретатор их попросту «не найдет». По аналогии и библиотеки, которые содержат функции, широко используемые различными программами, должны быть «объявлены» в системе, иначе программы не смогут их «найти». Можно утверждать, что при вызове функции из образа исполняемого файла, загрузчик Windows (менеджер, отвечающий за выделение памяти, подключение различных функций из образов памяти и прч.) должен знать откуда можно подгрузить библиотеку, содержащую требуемую функцию.
Если опираться на историю развития технологии распределенного кода, то можно сделать вывод, что regsvr32 обеспечивает регистрацию как классических библиотек DLL, так и продвинутых их собратьев, содержащих COM-объекты, поскольку со сборками .NET утилита уже не работает. Что же касается вопроса регистрации в системе применительно к библиотеке DLL на низком уровне, то она представляет собой алгоритм действий по модификации различных разделов реестра и каталогов файловой системы, результатом которого является «видимость» библиотеки приложениями. Если библиотека «сторонняя» (не системная), то регистрация библиотеки должна осуществляться на этапе инсталляции приложения, в состав которого она входит и для обслуживания функций которого она предназначается. В большинстве случаев сам процесс регистрации библиотеки выполняется при помощью вызова внешних специализированных системных утилит, либо определенной последовательности специализированных функций Windows API.

Зачастую нет необходимости самостоятельно (вручную) регистрировать DLL, практически всегда это выполняется автоматически при инсталляции компонентов системы/программы. Необходимость в ручной регистрации возникает, как правило, в случае каких-либо ошибок в системе: проблем инсталляции/деинсталляции программ, сбоях, либо в случае самостоятельно разрабатываемых DLL, которые необходимо оттестировать.

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

regsvr32 запуск программы невозможен

Ошибка сообщает нам о том, что загрузчик образа cDSsvc.exe не смог найти библиотеку MFC71.DLL, необходимую ей для функционирования. Один из способов устранения данного класса ошибок состоит в повторной инсталляции программы, в ситуации, когда файл искомой библиотеки входит в состав какого-либо дистрибутива, поскольку библиотека инсталлируется автоматически скриптом инсталляции. Если библиотека входит в состав другого пакета, например Microsoft Visual C++ 2010 x64 Redistributable, то переустановить необходимо именно его. Если же описанными способами ошибку исправить все же не удается, тогда нам на помощь приходит утилита Regsvr32.

[упрощенное] описание процесса регистрации библиотеки

Утилита regsvr32 при помощи системной функции LoadLibrary загружает библиотеку и, в зависимости от того входных параметров [командной строки], выполняет:

  • ищет в библиотеке точку входа и вызывает функцию DllRegisterServer либо DllUnRegisterServer данной библиотеки и смотрит на возвращаемый результат.
  • ищет в библиотеке точку входа и вызывает функции DllInstall / DllUnInstall.

Все это говорит в пользу того, что существуют определенные требования к структуре DLL, которую вы хотите регистрировать с помощью regsvr32. Для того, чтобы управляющий элемент можно было зарегистрировать с помощью regsvr32, в DLL должны быть реализованы функции DllRegisterServer, DllUnregisterServer, а при необходимости выполнения специфичных действий еще и функции DllInstall, DllUnInstall. Функции DllRegisterServer / DllUnregisterServer содержат логику, которая фактически и выполняет регистрацию библиотеки в системе, добавляя записи в реестр, требующиеся для управляющего элемента. Функции DllInstall / DllUnInstall служат для выполнения дополнительных действий, которые планирует произвести автор DLL. Поэтому помните, что:

Далеко не все DLL могут быть зарегистрированы при помощи regsvr32!

Давайте посмотрим, что же происходит в случае, когда, к примеру, не определена функция DllRegisterServer:

regsvr32 точка входа DllRegisterServer не найдена

В этом случае мы видим на экране ошибку: «Модуль ????????.??? загружен, но точка входа DllRegisterServer не найдена». Но, давайте как перейдем, непосредственно, к самому процессу регистрации.

Новый метод

Как мы уже говорили, для регистрации библиотеки используется функция DllRegisterServer(). Функция проверяет 128-битный глобальный идентификатор (GUID, Global Unique ID) всех объектов COM/ActiveX, обнаруженных в библиотеке и последовательно прописывает информацию о них в реестр. Тут мы видим что происходит как бы не регистрация библиотеки, а регистрация объектов в библиотеках. Как мы уже говорили выше, регистрация объектов необходима, поскольку программы работают не с самими файлами DLL/OCX/ACX, а с объектами, представляющими определенный набор интерфейсов. Как мы уже упоминали, для целей регистрации DLL используется раздел реестра HKEY_CLASSES_ROOT, который представляет собой комбинацию разделов:

  • ветвь HKLM\SOFTWARE\Classes\CLSID при регистрации COM-объектов библиотек для всех пользователей системы;
  • ветвь HKCU\SOFTWARE\Classes\CLSID при регистрации COM-объектов библиотек только лишь для текущего пользователя;
  • ветвь HKLM\SOFTWARE\Wow6432Node\Classes\CLSID для регистрации 32-битных DLL в 64-битных ОС Windows;
  • Таким образом можно сделать вывод, что процесс регистрации библиотеки заключается в информировании операционной системы о том, что реализация интерфейсов, предоставляемых объектом с определенным идентификатором, располагается в соответствующем файле.

    Если вам необходимо поменять расположение библиотеки DLL в системе (например, поменять директорию размещения), то потребуется её перерегистрация.

    Старый метод

    В дополнение к современному методу работы с COM-объектами, в реестре присутствует еще и ветка HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs. Могу предположить, что она относится к устаревшему методу регистрации общих библиотек DLL, базирующемуся на подсчете количества ссылок на библиотеку. Вероятно, она оставлена для совместимости и предназначена для регистрации библиотек, которые представляют собой устаревший вид библиотек, состоящих из набора функций. В этой ветке имеются параметры типа REG_DWORD, имена которых содержат полный путь к зарегистрированным в системе общим библиотекам (например: C:\Windows\system32\VBAME.DLL). Значение параметра может варьироваться от 1 до 65535. Дело в том, что значение это — счетчик использования или, как еще называют, количество ссылок. Зачастую этот метод регистрации использовался не-MSI инсталляторами. Каждый раз, когда какой-либо подобный установщик самостоятельно регистрирует в системе библиотеку, которая до этого уже была зарегистрирована кем-либо еще (то есть присутствует в SharedDLLs), он увеличивает счетчик использования на 1, когда же (например, при удалении) библиотека разрегистрируется, то счетчик уменьшается на 1. Подобная логика была реализована в первых версиях Windows для борьбы с таким явлением как «Ад DLL»(DLL Hell). У параметров некоторых библиотек можно наблюдать достаточно большие значения (4096), полагаю, таким образом маркируются критичные для системы библиотеки, и счетчик искусственно увеличен с той целью, чтобы разнообразные пользовательские пакеты при своем удалении, случайно не уменьшили счетчик использования до 0 и не выключили DLL.

    32-битные и 64-битные версии regsvr32

    Начиная с Windows XP, в зависимости от разрядности ОС, утилита regsvr32.exe располагается либо только в директории %SystemRoot%\System32 для 32-битных систем, либо в папках %SystemRoot%\System32 и %SystemRoot%\SysWOW64 для 64-битных (присутствуют две разные версии программы). Представляет собой утилиту командной строки, то есть, иными словами, работает с консолью и может использоваться в сценариях.

    В данный момент более активно начали использоваться 64-битные версии Windows. Если в 32-битных версиях Windows всё было достаточно прозрачно и присутствовало только одна версия программы, то в 64-битных версиях ОС имеются две версии утилиты regsvr32:

    • 64-разрядная версия утилиты — %SystemRoot%\System32\regsvr32.exe (используется по-умолчанию при запуске без конкретизации пути);
    • 32-разрядная версия утилиты — %systemRoot%\SysWoW64\regsvr32.exe

    Получается, в 64-битной системе разработчики сохранили прежнюю систему именования каталогов, однако поместили туда уже «родные» 64-битные приложения. Объясняется это обеспечением совместимости приложений и уменьшением временных затрат на трансляцию кода из 32- в 64-разрядную версию Windows. Таким образом, в 64-битной версии Windows могут работать как 32-битные, так и 64-битные версии программ, соответственно, и DLL могут использоваться и 32- и 64-разрядные.
    Когда вы запускаете regsvr32 в 64-битной версии ОС для регистрации DLL, вы по-умолчанию используете 64-битную версию утилиты.

    Для 64-битных ОС Windows существует золотое правило: директория System32 системы предназначается для родных 64-битных приложений, директория SysWOW64 для 32-битных. Немного не интуитивно, однако это сложившийся факт!! WOW64 (Windows on Windows64) — 32-битная подсистема, которая запускается в 64-битной среде.

    Поэтому, если вам требуется зарегистрировать 32-разрядную версию библиотеки DLL в 64-разрядной ОС, и у вас возникает ошибка, то можно поступить следующим образом:

    1. Открыть командную строку с правами администратора;
    2. Если требуемая для регистрации 32-разрядная библиотека DLL находится в директории %SystemRoot%\System32, переместить ее в папку %SystemRoot%\SysWoW64;
    3. Выполнить команду:
      %SystemRoot%\SysWoW64\regsvr32 <полный путь к библиотеке DLL>

      то есть, к примеру: %SystemRoot%\SysWoW64\regsvr32 %SystemRoot%\SysWOW64\test.dll

    Если же перед вами стоит задача зарегистрировать 64-битную DLL в 64-разрядной ОС:

    1. Открыть командную строку с правами администратора;
    2. Если требуемая для регистрации 64-разрядная библиотека DLL находится в директории %SystemRoot%\SysWOW64, переместить ее в папку %SystemRoot%\System32
    3. Выполнить команду:
      %SystemRoot%\System32\regsvr32 <полный путь к библиотеке DLL>

      то есть, например: %SystemRoot%\System32\regsvr32 %SystemRoot%\System32\test.dll

    Синтаксис regsvr32

    Как уже говорилось выше, regsvr32 — это утилита командной строки, поэтому в целях практического использования может запускаться из-под всем уже знакомой cmd, либо использоваться в сценариях.

    В большинстве случаев, для регистрации DLL требуются повышенные привилегии, то есть права локального администратора.

    Утилита regsvr32.exe имеет следующие параметры командной строки:

    Regsvr32 [/u] [/s] [/n] [/i[:cmdline]]

    Список ключей утилиты и описание их действия приведем в следующей таблице:

    Параметр Описание

    /u

    Отменяет регистрацию DLL. Отменить можно только регистрацию DLL, команда не применима к элементам управления и фильтрам.

    /i

    вызывает функцию DllInstall, передавая ей в качестве параметра необязательную строку команд cmdline; Вызов DllInstall приводит к вызову стандартных функций регистрации DllRegisterServer/DllUnRegisterServer, однако позволяет передать строку параметров, которые могут изменить поведение регистрации, например провести регистрацию DLL более одного раза. Ключ /i при использовании с ключом /u вызывает DllUnInstall.

    /n

    не вызывает DllRegisterServer, то есть вызывается только DllInstall; это может быть использовано с ключом /i для передачи дополнительных параметров для регистрации.

    /s

    «тихий» режим; сообщения не отображаются.

    В общем случае, регистрация библиотеки DLL при помощи regsvr32 может быть выполнена следующей командой:

    regsvr32 <имя_библиотеки>.dll

    Например:

    regsvr32 «C:\Windows\System32\schmmgmt.dll»

    Напоминаю, будьте внимательны с версиями утилиты regsvr32 под Windows различной разрядности. В некоторых случаях приходится уточнять путь к утилите при запуске.
    Более того, практически всегда, когда регистрируемый компонент лежит вне путей, включенных в переменную %PATH% (к примеру, если он не находится в %SystemRoot%\System32), путь к компоненту приходится уточнять!
    Пример:

    %SystemRoot%\System32\Regsvr32 %SystemRoot%\System32\macromed\Flash\Flash10a.ocx

    *Составные пути к файлу должны заключаться в кавычки по правилам синтаксиса командной строки Windows.

  • C windows system32 reg exe что это
  • C windows system32 powrprof dll
  • C windows system32 policymanager dll
  • C windows system32 svchost exe k bthsvcs
  • C windows system32 ntkrnlpa exe