Как зарегистрировать exe файл

Обновлено: 29.06.2024

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)

    • 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 может служить строка вида . В глобальном смысле данные уникальные номера "не повторяются" и уникально идентифицируют компоненты системы, что говорит нам об уникальности объекта класса библиотеки в пределах системы. Подразделами в этих ветках реестра могут быть:

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

    Сборки (assembly)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Новый метод

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

    Если вам необходимо поменять расположение библиотеки 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>

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

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

    Синтаксис regsvr32

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

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

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

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

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

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

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

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

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

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

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

    Аннотация

    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

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

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

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

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

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

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

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

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

    Как вы можете сделать файл .exe доступным из любого места в командном окне Windows? Должна быть введена запись реестра?

    Вам нужно убедиться, что exe находится в папке, которая находится в переменной среды PATH .

    Вы можете сделать это, установив его в папку, которая уже находится на PATH , или добавив вашу папку в PATH .

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

    Вы можете добавить следующий раздел реестра:

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

    Другим решением, которое я лично предпочитаю, является использование RapidEE для более плавного редактирования переменных.

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

    Такой командный файл может выглядеть следующим образом:

    Windows 10, 8.1, 8

    Удивительно, что нет простого решения для такой простой задачи в окнах,
    Я создал этот маленький cmd script, который вы можете использовать для определения псевдонимов в окнах (инструкции находятся в самом заголовке файла):

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

    Вы также можете навсегда (после перезагрузки) добавить к переменной Path этот путь:

    Используйте 1-строчный пакетный файл в вашей установке:

    запустите файл bat

    Теперь поместите ваш .exe в c:\windows, и все готово.

    Простые Bash -подобные псевдонимы в Windows

    Чтобы получить глобальные псевдонимы Bash в Windows для приложений, не добавленных в путь автоматически, без добавления каждой из них вручную, здесь самое чистое решение, которое я придумал, делает минимальное количество изменений в и имеет максимальную гибкость для последующей настройки:

    Добавьте свой псевдоним

    Открыть в новом окне оболочки

    Чтобы запустить C:\path to\my program.exe , передав все аргументы, открыв его в новом окне, создайте файл c:\aliases\my program.bat со следующим содержимым (см. NT Start Команда для получения более подробной информации о стартовом комманде):

    Выполнение в окне текущей оболочки

    Чтобы запустить C:\path to\my program.exe , передав все аргументы, но запустив его в том же окне (более похоже на то, как работает bash), создайте файл c:\aliases\my program.bat со следующим содержимым:

    Выполнить в окне текущей оболочки 2

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

    Теперь я могу просто напечатать и использовать azcopy из любого места из любой командной строки shell inc, powershell, git bash и т.д.

    Добавьте в PATH, шаги ниже (Windows 10):

    Другим способом может быть добавление .LNK к вашему $ PATHEX.
    Затем просто создайте ярлык для вашего исполняемого файла (т.е. yourshortcut.lnk) и поместите его в любой из каталогов, перечисленных в $ PATH.

    Если кто-то ищет это после меня
    здесь очень простой способ добавить свой Путь.

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

    Как зарегистрировать DLL в Windows 10 и Windows 11

    Среди частых вопросов пользователей, особенно после того, как они сталкиваются с тем, что какая-то из библиотек DLL отсутствует в Windows 10, Windows 11 или других версиях системы — как зарегистрировать DLL в соответствующей версии ОС.

    В этой инструкции подробно о способах регистрации библиотек DLL в Windows x64 и x86 (32-бит) с помощью regsvr32.exe (и кратко о regasm.exe), о возможных нюансах и проблемах, которые могут возникнуть в процессе.

    Дальнейшие шаги описаны в предположении, что DLL, которую нужно зарегистрировать, уже находится в нужном расположении: папке C:\Windows\System32, C:\Windows\SysWOW64 или, в некоторых случаях — отдельных папках программ, к которой относится соответствующая библиотека, например, для 1С — C:\Program Files\1cv8\номер_версии\bin (или Program Files x86 в случае 32-битной версии).

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

    • В x64 версиях Windows 64-битные DLL хранятся в System32, а 32-битные — в SysWOW64 (у некоторых начинающих пользователей бывает обратное предположение исходя из имён папок).
    • Файлы DLL x64 и x86 (32-бит) — это разные файлы. И если прямого указания на разрядность в месте загрузки файла нет, то чаще это 32-битный файл (что не мешает ему работать в x64 системе), но это не всегда так.
    • Для регистрации библиотеки DLL используется системный инструмент regsvr32.exe, который также доступен в двух версиях, которые лежат в папках System32 и SysWOW64 (в случае 64-битных систем). По умолчанию при описываемых далее действиях запускается x64 версия.
    • 32-битным программам и играм (по умолчанию устанавливаются в Program Files x86 в 32-битных системах) для работы нужны 32-битные DLL, не зависимо от разрядности Windows.

    Сам процесс регистрации в общем случае состоит из следующих шагов:

    Ошибка регистрации regsvr32 точка входа DllRegisterServer не найдена

    Почему не удается зарегистрировать DLL

    Ошибка при регистрации с помощью regsvr32 вида «Точка входа DllRegisterServer не найдена» говорит о том, что эта библиотека DLL не поддерживает регистрацию описанным методом. Можно попробовать использовать вариант команды:

    но с большой вероятностью и это не поможет.

    У большинства домашних пользователей такая проблема возникает при регистрации файлов DLL для игр и программ, часто не вполне лицензионных, которые сообщили, что нужный файл DLL не обнаружен или отсутствует. Причем сами библиотеки DLL обычно скачаны со сторонних сайтов (и чаще всего имеют имена начинающиеся с «vc», «msvc» или «d3d»). А решение, как правило, простое — выяснить, частью какого набора компонентов является эта DLL и установить эти компоненты с помощью их собственного установщика. Более подробно проблема и подходы к решению описаны в инструкции Точка входа DllRegisterServer не найдена — причины и возможные решения.

    Видео

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

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