Время на прочтение
14 мин
Количество просмотров 4.6K
В этой статье я хочу поделиться практическими методами отладки, модификации и устранения багов в 32-х и 64-х разрядных приложениях под ОС Windows, разработанных на языке C/C++, исходные коды которых по тем или иным причинам не стали достоянием общественности.
Этот пробел отчасти можно попытаться устранить, например, с помощью плагина Hex-Rays для IDA Pro, и зачастую удаётся довольно качественно восстановить нужный участок исходного кода, обнаружив в нём проблемное место. Но после этого всегда возникает вопрос — что с этим исправленным кодом делать дальше, как и где его можно использовать? На данном этапе мне всегда хотелось взять этот отдельно декомпилированный фрагмент программы, поменять в нём что-нибудь и затем каким-то чудесным образом «поместить обратно» в программу.
Далее будет описан один из возможных способов реализации этой идеи на практике.
Иногда возникает необходимость исправить какой-нибудь баг в сторонней программе, добавить к ней отсутствующий функционал, изменить существующий, либо модифицировать логику некоторых процессов, особенно если нет возможности обратиться за помощью к разработчикам. Описание процедуры выявления «интересных» мест выходит за рамки данной статьи. В некоторых случаях это может быть банальная ошибка в программе, которую удаётся вылечить несложным патчем непосредственно в теле EXE или DLL файла. Но если же предстоит исправлять алгоритмы поведения некоторых функций, либо добавлять новые, обычным «байтовым» патчем здесь уже не обойтись. Устранение же некоторых на первый взгляд простых багов может в итоге вылиться в «перепахивание» доброй половины программы. Также приходится потрудиться, чтобы заставить правильно работать приложения, созданные, например, под Win XP в новых ОС Windows.
Освоив и давно применяя на практике некоторые методы модификации программного кода, самым удобным и простым на мой взгляд способом оказалась его модификация в ран-тайме с помощь метода DLL-инъекции. На эту тему существует огромное количество материала и в плане реализации самого метода DLL-инъекции данная статья не претендует ни на новизну, ни на оригинальность, но в большей степени призвана систематизировать практические наработки в области отладки, модификации, поиска и устранения багов в чужом коде с его помощью.
Описываемый здесь способ вынесения некоторых функций сторонних приложений в свою собственную программу на C/C++ позволяет отлаживать, модифицировать и при необходимости более детально изучать их работу с помощью отладчика на высокоуровневом языке, вместо того, чтобы «дебажить» их в дизассемблированном коде.
Прилагаемый к данной статье пример с помощью минимальных изменений можно использовать в своих целях в качестве готового проекта для Visual Studio (VS).
В VS при создании 32-х разрядных приложений платформа называется «x86», а 64-x разрядных «x64». Поэтому чтобы не путаться с названиями я буду для обозначения разрядности приложений использовать термины «Win32» и «Win64».
Инструментарий.
-
IDA Pro (файлы примеров в проекте для v7.5).
-
CFF Explorer или любой другой инструмент редактирования импорта.
-
Visual Studio С/C++ (проект примера для Platform Toolset: Visual Studio 2022 (v143)).
Практика внедрения.
Для примера рассмотрим тестовую программу SimpleCalc – простое оконное приложение (проект для VS прилагается), которое производит сложение и умножение двух чисел.
В программу намеренно внесён «баг», приводящий к тому, что для операций «2+2» и «2*2» результат получается равным 5. Заголовок диалогового окна данного приложения — «Simple Buggy Calc ( 2+2=5; 2*2=5 )».
Следовательно, нам будет необходимо модифицировать его работу таким образом, чтобы в результате выполнения уникальных операций 2+2 и 2*2 получались правильные значения, а текст заголовка окна выглядел бы, как «Simple Calc».
Программа SimpleCalc была написана так, чтобы в ней использовался класс, реализующий метод интерфейса, выполняющий операцию сложения и обычный метод, выполняющий операцию умножения для того, чтобы показать различные способы модификации кода в том и ином случае.
Для начала в дизассемблированном коде программы необходимо найти методы, выполняющие операции сложения и умножения, а также место создания главного окна. Воспользуемся для этого дизассемблером IDA Pro.
Займёмся описанием класса Adder (имя этому классу можно задать любое).
Для работы с классами в IDA Pro существует плагин ClassInformer. В некоторых случаях он может помочь восстановить иерархию классов и имена виртуальных таблиц, чтобы получить близкие к оригиналу имена классов.
Место создания класса Adder обнаруживается в методе DialogProc, откуда можно определить его размер (для Win32 версии):
INT_PTR CALLBACK DialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
...
pAdder = operator new( 0x10 ); // Размер структуры для класса Adder
if( pAdder )
{
sub_401870( pAdder, 0x10 ); // Метод инициализации, созданный компилятором
pAdder = sub_401160( pAdder, hDlg ); // Вызов конструктора Adder::Adder()
}
else
{
pAdder = 0;
}
_pAdder = pAdder;
...
Псевдокод конструктора в IDA Pro:
void* __thiscall sub_401160( void* this, HWND hDlg )
{
*(_DWORD*)this = &Adder::`vftable';
*((_DWORD*)this + 2) = GetDlgItem( hDlg, 1001 );
*((_DWORD*)this + 3) = GetDlgItem( hDlg, 1002 );
*((_DWORD*)this + 1) = GetDlgItem( hDlg, 1003 );
return this;
}
Теперь создим в IDA Pro структуру такого же размера с именем класса. В нашем случае структура для класса и интерфейса будет выглядеть так:
IAdder struc ; (sizeof=0x4)
Add dd ? ; Адрес метода, выполняющего операцию сложения.
IAdder ends
Adder struc ; (sizeof=0x10)
pVftable dd ? ; IAdder* - указатель на таблицу методов интерфейса IAdder
_hRes dd ? ; HWND - идентификатор окна суммы
_hAdd1 dd ? ; HWND - идентификатор окна ввода для первого слагаемого
_hAdd2 dd ? ; HWND - идентификатор окна ввода для второго слагаемого
Adder ends
После присваивания типа вновь созданной структуры Adder соответствующим указателям и переименования методов класса, процедура его создания преобразится следующим образом:
INT_PTR CALLBACK DialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
...
pAdder = (Adder*)operator new( sizeof( Adder ) );
if( pAdder )
{
Adder:: __autoclassinit2( pAdder, sizeof( Adder ) ); // Метод инициализации, созданный компилятором
pAdder = Adder::Adder( pAdder, hDlg ); // Конструктор
}
else
{
pAdder = 0;
}
_pAdder = pAdder;
...
А конструктор будет теперь выглядеть так:
Adder* __thiscall Adder::Adder( Adder* this, HWND hDlg )
{
this->pVftable = (IAdder*)&Adder::`vftable'; // Адрес таблицы методов интерфейса IAdder
this->_hAdd1 = GetDlgItem( hDlg, IDC_ADD_EDIT1 );
this->_hAdd2 = GetDlgItem( hDlg, IDC_ADD_EDIT2 );
this->_hRes = GetDlgItem( hDlg, IDC_ADD_RES );
return this;
}
Т.к. вызов реализованного метода Add интерфейса IAdder в программе происходит через таблицу адресов, найдём его в этой таблице Adder::`vftable’.
После причёсывания декомпилированного псевдокода в IDA Pro метод Adder::Add будет выглядеть примерно так:
// 0x4011B0
void __thiscall Adder::Add( Adder* this )
{
int res;
int add2;
int add1;
char* pBuf;
pBuf = (char*)operator_new( 64 );
GetWindowTextA( this->_hAdd1, pBuf, 64 );
add1 = itol( pBuf );
GetWindowTextA( this->_hAdd2, pBuf, 64 );
add2 = itol( pBuf );
// Этот «баг» нам необходимо будет исправить в своей DLL.
//
if( add1 == 2 && add2 == 2 )
res = 5;
else
res = add2 + add1;
sprintf_s( pBuf, 0x40, "%ld", res );
SetWindowTextA( this->_hRes, pBuf );
DeleteBuf( this, pBuf )
}
Здесь для нас важно запомнить адрес этого метода — 0x4011B0.
Теперь перейдём к поиску и декомпиляции метода, производящего операцию умножения.
Его вызов также обнаруживается в методе DialogProc и после декомпиляции (для Win32 версии) будет выглядеть так:
// 0x401150
void __usercall Mult( HWND hMul1@<eax>, HWND hMul2@<ebx> )
{
Mult_( hMul1, hMul2 );
}
А код метода Mult_() так:
void __stdcall Mult_( HWND* hMul1, HWND* hMul2 )
{
int res;
int mul2;
int mul1;
char buf[64];
GetWindowTextA( hMul1, buf, sizeof( buf ) );
mul1 = itol( buf );
GetWindowTextA( hMul2, buf, sizeof( buf ) );
mul2 = itol( buf );
// Этот «баг» нам необходимо будет исправить в своей DLL.
//
if( mul1 == 2 && mul2 == 2 )
res = 5;
else
res = mul2 * mul1;
sprintf_s( buf, sizeof( buf ), "%ld", res );
SetWindowTextA( g_hMulRes, buf );
}
В программе SimpleCalc метод Mult() намеренно был создан, как псевдо __usercall с передачей параметров через регистры EAX и EBX. Компилятор от MS для Win32 использует соглашения о вызовах __cdecl, __stdcall или __thiscall, но некоторые другие компиляторы могут использовать иные соглашения и примером такого поведения является метод Mult().
Конечно, в данном конкретном случае можно было бы ограничиться исправлением только __stdcall метода Mult_(), но для полноты картины опишем способ с нестандартным для MS соглашением о вызовах.
Для того, чтобы поместить значения регистров в стек для вызова «обычного» метода __stdcall Mult_() из метода Mult(), воспользуемся атрибутом naked. Этот атрибут указывает компилятору не создавать пролог и эпилог внутри метода, чтобы не испортить значения регистров EAX и EBX (в нашем случае) до помещения их в стек:
// void __usercall Mult( HWND hMul1@<eax>, HWND hMul2@<ebx> )
__declspec( naked )
void Mult()
{
__asm
{
push ebx
push eax
call Mult_
ret
}
}
PATCH( 0x401150, Mult )
Можно было бы написать код метода Mult() и на чистом ассемблере, а для Win64 это единственный способ, так как в MSVC для него не поддерживается атрибут naked. Но для Win64, как правило, используется соглашение о вызове __fastcall и другие, по крайней мере среди тех приложений, которые мне приходилось «лечить», не попадались.
В методе Mult_(), реализующем операцию умножения, мы обнаруживаем использование глобальной переменной:
// 0x41B36C
HWND g_hMulRes;
Адреса метода Mult() и глобальной переменной g_hMulRes нам понадобятся, поэтому их необходимо будет запомнить.
Способ изменения заголовка диалогового окна будет описан чуть позже.
Создание инжектируемой DLL.
Итак, мы обнаружили и декомпилировали интересующие нас методы и теперь перейдём к созданию собственной DLL, которую позже внедрим в тестовую программу SimpleCalc. Проект такой DLL (Win32 и Win64) для VS прилагается.
Основная идея метода DLL-Injection заключается в том, что на этапе загрузки приложения, но ещё до передачи ему управления, загрузчик ОС, среди прочих, загрузит в общее адресное пространство и нашу DLL (которую мы добавим в секцию импорта EXE файла) и вызовет из неё метод:
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason, LPVOID lpReserved )
со значением переменной ul_reason равным DLL_PROCESS_ATTACH.
Для упрощения описания не будем рассматривать здесь частные случаи типа отложенной загрузки, LoadLibrary или TLS-коллбэков.
На данном этапе мы должны модифицировать начальную часть перехватываемых нами методов из EXE файла по адресам, полученным из IDA Pro, разместив там команды безусловных переходов на адреса наших переписанных в DLL методов.
Для Win32 команда перехода, содержащая адрес непосредственно в своём операнде (а нам нужна именно такая, чтобы не портить ни стек, ни регистры) состоит из пяти байт, первый — 0xE9, а остальные четыре знаковое смещение относительно адреса следующей команды.
Для Win64 эта команда состоит из шести байт: 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00 и следом за ними восемь байт адрес перехода – итого четырнадцать байт.
Здесь необходимо следить за тем, чтобы длина команды перехода была не больше длины самого модифицируемого метода! Как, например, для «заглушек», содержащих единственную однобайтовую команду ret.
Установкой адреса перехода занимается метод Patch(). Так как адресное пространство EXE модуля, в котором расположен исполняемый код недоступно для записи, сначала мы модифицируем права доступа к этой памяти с помощью функции VirtualProtect, затем записываем в начало перехватываемого метода нужные байты – команду перехода на наш метод в DLL и в конце восстанавливаем прежние права с помощью той же функции VirtualProtect.
При расчёте адреса перехода существует одна тонкость, заключающаяся в том, что IDA Pro по умолчанию дизассемблирует EXE файл по стандартному адресу загрузки — 0x00400000 (либо 0x140000000 для Win64). Но иногда встречаются EXE файлы, у которых в заголовке в параметре IMAGE_NT_HEADER.OptionalHeader.DllCharacteristics установлен флаг «DLL Can Move» и в этом случае ОС вправе загрузить его по любому другому адресу.
В свойствах проекта SimpleCalc в VS – за этот флаг отвечает пункт «Linker -> Advanced -> Randomize Base Address», который намеренно установлен в «Yes» для тестирования данного поведения.
Следовательно, в нашей DLL мы должны учитывать адрес, по которому загружен EXE файл, и затем использовать его в методе Patch() для расчёта смещения в команде перехода относительно адреса взятого из IDA Pro.
При работе с большими проектами, в которых используется множество классов, исходный код DLL в VS обрастает большим количеством отдельных файлов. И следить за тем, перехвачен ли тот или иной метод в DllMain с помощью вызова Patch() становится неудобным. Поэтому впоследствии был использован способ для объявления перехвата непосредственно возле нужного метода с помощью вспомогательной статической структуры. При этом оказалось возможным отказаться от использования DllMain, как места для объявления всех перехватов.
В дополнение к этому был создан вспомогательный класс CPatch.
При загрузке DLL ещё до попадания в точку входа (DllMain) инициализируются все статические объекты и таким образом, через вызов метода Patch( exeAddr, dllAdd ) происходит замена первых байт из оригинального метода в EXE на команду перехода в переписанный нами метод в DLL.
Класс CPatch содержит в себе контейнер std::map<ADDR, PATCH_DATA>, ключом в котором является адрес оригинального метода из EXE, а значением – структура PATCH_DATA, в которой хранятся оригинальные байты, заменённые на команду перехода и байты самой команды перехода. При каждом вызове метода Patch( exeAddr, dllAddr ) в этот контейнер добавляется новый элемент с соответствующим ключом – адресом оригинального метода из EXE и структурой PATCH_DATA, описанной выше.
В классе CPatch также содержатся методы Patch( exeAddr ) и Unpatch( exeAddr ), смысл использования которых состоит в следующем. Иногда бывает необходимо «попасть» в какой-нибудь метод из EXE, чтобы проконтролировать передаваемые в него аргументы, сохранив их значения, скажем, в лог файл, но весь метод для этого переписывать и декомпилировать в наши планы пока не входит.
Приведём пример использования этих методов для изменения заголовка диалогового окна программы SimpleCalc.
«Пропатчим» оконную процедуру диалогового окна DialogProc таким образом, что при попадании в наш переписанный метод DialogProc в DLL мы каждый раз будем восстанавливать оригинальные байты в EXE методе с помощью _patch->Unpatch(), вызывать оригинальный метод и после этого проверять значение аргумента uMsg. Если оно будет равным WM_INITDIALOG, для нас это может означает, что можем менять его заголовок. При всех других значениях аргумента uMsg, перед выходом из нашего метода DialogProc мы снова будем меняем начальные байты оригинального метода EXE на команду перехода на наш метод в DLL с помощью _patch->Patch().
// 0x4012C0
INT_PTR CALLBACK DialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
_patch->Unpatch( 0x4012C0 );
auto res = ( ( INT_PTR( CALLBACK* )( HWND, UINT, WPARAM, LPARAM ) )A( 0x4012C0 ) )( hDlg, uMsg, wParam, lParam );
if( uMsg == WM_INITDIALOG )
{
::SetWindowText( hDlg, "Simple Calc" );
}
else
{
_patch->Patch( 0x4012C0 );
}
return res;
}
PATCH( 0x4012C0, DialogProc )
Проверка работоспособности инжектируемой DLL.
После создания DLL, в которой описан класс Adder, метод Mul() и DialogProc() необходимо дополнительно объявить в ней один экспортируемый метод с любым именем. В нашем случае им будет пустой метод Setup(). В свойствах проекта в VS помещаем созданную DLL в ту же директорию, что и EXE файл.
Теперь настало время добавить в секцию импорта программы SimpleCalc созданную нами DLL и единственный экспортируемый из неё метод Setup(). Для этого можно воспользоваться утилитой CFF Explorer. Открываем в ней EXE файл SimpleCalc, в левой части окна выбираем пункт «Import Adder», в открывшемся окне нажимаем кнопку «Add» и выбираем наш DLL файл. После этого в окне «Exported Functions» должен отобразиться наш единственный экспортируемый метод Setup(), выделяем его мышкой и нажимаем кнопку «Import By Name» после чего он отобразится в соседнем справа окне «Imported Functions»:
Затем нажимаем кнопку «Rebuild Import Table» и перезаписываем исходный EXE файл через меню «File -> Save» или сохраняем его с новым именем «File -> Save As».
Часто возникает соблазн внедрить свой код в чужой файл без какой бы то нибыло его модификации. Обычно любой EXE файл импортирует несколько системных DLL из которых, к тому же, используются далеко не все методы. При этом можно было бы создать свою DLL с тем же именем, скажем, kernel32.dll. Описать в ней прокси переходы для всех импортируемых из этой DLL методов, добавить свои и в итоге поместить её в тот же каталог рядом с EXE файлом. Но MS об этом тоже подумала и создала список так называемых Known DLLs, куда входят все системные, чтобы они не могли загружаться из того же каталога, что и EXE.
Существует способ обойти это ограничение, но в мои планы не входило создание вирусов, программ-шпионов, или подключение к уже запущенным процессам, поэтому модификация секции импорта EXE файла выглядит в данном случае абсолютно приемлемой и совершенно несложной операцией.
Теперь в VS в свойствах DLL проекта в разделе «Debugging» в пункте «Command» прописываем путь к модифицированному EXE файлу, ставим точки останова на начало методов Add, Mult, DialogProc и стартуем отладку. Сначала мы должны попасть в метод DialogProc, а при нажатии в окне программы на кнопку «=» — в соответствующий метод вычисления суммы или произведения. Убеждаемся, что патч программы был произведен успешно.
Вызов методов EXE файла из DLL.
Как правило, из метода, который мы переписали в своей DLL, вызывается несколько других, которые на данном этапе нас не интересуют, либо мы планируем перейти к их разбору позже.
Предположим, у нас есть метод sub_4037B0, из которого вызывается другой, по адресу 0x404800. Тогда, определив из дизассемблера соглашение о вызове этого метода и тип аргументов, можно будет вызвать его таким образом:
int sub_4037B0()
{
HWND hDlg;
...
// int __cdecl sub_404800( HWND hDlg );
int res = ((int(__cdecl*)(HWND))0x404800)( hDlg );
...
}
Если же он вызывается из множества мест нашей DLL, но декомпилировать его пока в наши планы не входит, можно реализовать его таким образом:
int __cdecl sub_404800( HWND hDlg )
{
return ((int(__cdecl*)(HWND))0x404800)( hDlg );
}
Для случая, если метод является членом класса, его вызов будет выглядеть так:
int ClassA::sub_4037B0()
{
HWND hDlg;
...
// int __thiscall ClassA::sub_404800( HWND hDlg );
int res = ((int(__thiscall*)( ClassA*, HWND ))0x404800)( this, hDlg );
...
}
или, опять же:
int ClassA::sub_404800(( HWND hDlg )
{
return ((int(__thiscall*)(ClassA*, HWND))0x404800)( this, hDlg );
}
Способ вызова методов с нестандартными для MSVC соглашениями о вызовах был описан выше на примере с __usercall Mult().
Доступ к данным EXE файла из DLL.
В случае, если метод сторонней программы, перехват которого производится, был написан с использованием классов и все данные, используемые в этом методе – члены этого (или другого) класса, то доступ к ним в своём переписанном методе сводится лишь к правильному описанию самого класса. Если все члены класса расположены в его описании строго на своих местах, то и доступ к ним будет осуществляться автоматически по их имени (как в классе Adder). Их значения также будут отображаться в отладчике VS через указатель this.
Но в случае использования глобальных переменных ситуация усложняется. Доступ к таким переменным можно получить лишь по их адресу в памяти основной программы, взятому из дизассемблера. В MSVC, к сожалению, невозможно объявить переменную по абсолютному адресу (даже без выделения для неё памяти), как это делается во многих Embedded системах, поэтому приходится объявлять глобальные переменные для указателей, например, таким образом:
#define _ptr1 ((int*)0x40BEF4)
а для переменных, используемых по значению, таким:
#define _val1 (*(int*)0x40BEF8)
Но, во-первых, при этом возникает огромное неудобство при отладке программы. Дело в том, что VS не отображает в отладчике значения макросов, объявленных с помощью директивы препроцессора #define. А во-вторых, что ещё более печально, для указателя, объявленного таким образом, не удаётся получить его адрес:
int** pptr1 = &_ptr1; // error C2101: '&' on constant
Можно объявить и инициализировать указатель так:
int* _ptr1 = (int*)0x40BEF4;
И это будет работать для отображения его значения в отладчике и для операции разадресации «*_ptr1», но как только мы попытаемся получить адрес этого указателя, им окажется адрес нашей локальной переменной _ptr1 в адресном пространстве DLL.
Применение оператора «placement new» тоже не даёт нужного результата, т.к. непосредственно переменную с нужным именем разместить по конкретному адресу не удаётся. Так, например, конструкция типа:
int* _ptr1 = new((int*)0x40BEF4) int(5);
действительно размещает объект типа int со значением 5 по адресу 0x40BEF4, но не переменную _ptr1 ! А она опять же находится в адресном пространстве DLL, что для нашей задачи равносильно определению:
int* _ptr1 = (int*)0x40BEF4;
Поэтому в качестве универсального метода пришлось прибегнуть к такой страшноватой конструкции, помещая переменную в структуру:
#define VAR(name,type,addr) \
typedef struct { type var; } name##_; \
auto name = (name##_*)(addr);
Здесь мы сначала объявляем новый тип структуры, который содержит в себе единственный элемент – нашу переменную с именем var. Затем создаём указатель на эту структуру с именем нашей переменной и инициализируем его адресом этой переменной из EXE файла.
Объявление глобальной переменной g_hMulRes в этом случае будет выглядеть так:
VAR( g_hMulRes, HWND, 0x41B36C )
а обращение к ней так:
g_hMulRes->var
Несколько «ugly», но зато с этой переменной можно производить операции взятия адреса, разадресации и, что немаловажно, её значение будет отображаться в отладчике.
Буду весьма признателен, если кто-нибудь подсказажет более изящный способ решения этого вопроса.
Управление памятью.
При сборке EXE файла использовалась та или иная версия библиотеки C/C++ (например, CRT), в которой были определены операторы и методы для управления памятью «new», «delete», «malloc», «free» и другие. И эта версия может и скорее всего будет не совпадать с версией библиотеки используемой для линковки с DLL.
Если в каком-либо из переписанных из EXE в DLL методов применяется один из этих операторов, например «new» для выделения памяти, а для её освобождения будет соответственно использоваться оператор «delete», но уже в недрах EXE модуля, то при работе программы может возникнуть исключение. Поэтому, если в переписанном методе в DLL необходимо использовать отдельный оператор «new» или «delete», предпочтительнее вызывать его по соответствующему адресу из EXE модуля, определив его предварительно в дизассемблере.
Пример такого поведения содержится в проекте DLL в методе Adder::Add() для создания массива символов.
Ведение логов.
Иногда может оказаться полезным регистрация каких либо событий, происходящих в сторонней программе.
Для реализации такого примера в конструкторе метода Patch тестовой DLL создаётся и открывается на запись файл SimpleCalc.log, а затем в этот файл записываются производимые пользователем операции.
Заключение.
Описанный здесь способ неоднократно помог мне в самых различных ситуациях. С его помощью были исправлены баги и недочёты в десятках программных продуктах для моей частной и профессиональной деятельности и я по сей день прибегаю к его использованию. Он одинаково хорошо применим для работы с 32-х и 64-х разрядными приложениями и апробирован на различных версиях ОС Windows, так что его смело можно рекомендовать к практическому применению при минимальных трудозатратах на внедрение.
Спасибо за проявленный интерес!
Приложение.
Архивный файл с проектом программы SimpleCalc и тестовой DLL для VS.
Прошли времена, когда для написания компьютерной программы от программиста требовалось только знание одного или нескольких языков программирования без привязки к конкретной операционной системе. Сегодня даже относительно простые программы используют готовые наборы библиотек, являющиеся встроенными или устанавливаемыми компонентами ОС. В некоторых случаях использование этих библиотек вызывается некорректно, особенно если вы используете взломанное программное обеспечение, и тогда для их регистрации требуется использование утилиты regsvr32.exe, запускаемой из командной строки. Но и эта операция часто заканчивается неудачно, с ошибочным сообщением «Не удалось загрузить модуль <Имярек>». Сегодня мы рассмотрим, почему возникает ошибка и как от неё избавиться.
Почему возникает ошибка regsvr32
Итак, утилита regsvr32.exe, являющаяся частью операционной системы Windows (начиная с версии 95), – это инструмент, основным предназначением которого является регистрация различных компонентов ОС. Прежде всего – использующих технологию OLE, а таковыми являются, например, элементы ActiveX, позволяющие интегрировать программы в среду Windows вне зависимости от того, на каком языке программирования они написаны. Разумеется, это относится и к любым другим динамическим библиотекам, использующим формат DLL.
При инсталляции программ на компьютер они пытаются определить, присутствуют ли в системе установленные модули, необходимые для их правильного кроссплатформенного функционирования. И если нет, пытаются их установить самостоятельно, во многих случаях – путём простого копирования в системную папку. Однако часто этого оказывается недостаточно, поскольку операционной системе нужно знать не только где находится нужная компонента, но и как с ней работать.
Вот как раз для этих целей и нужен инструмент regsvr32.exe, который регистрирует новые компоненты в системе, если этого не сделала инсталлируемая программа. Утилита запускается только из командной строки, и её отработка отнюдь не всегда происходит успешно. Иногда вместо успешной регистрации библиотеки пользователь наблюдает ошибочное сообщение regsvr32 «Не удалось загрузить модуль <Имя компоненты>».
Причины ошибки могут быть разными: от неправильного пути размещения самой утилиты до ошибочных действий пользователя. Как правило, с этой ошибкой чаще всего сталкиваются геймеры, нередко устанавливающие на компьютер пиратские копии игр. Обычно те модули, которые отвечают за обход лицензирования или взлом, требуют регистрации недостающих динамических библиотек вручную. Впрочем, иногда такие действия требуются и при установке «хороших» и даже достаточно популярных и известных программ, например, при установке Creative Cloud от компании Adobe. Программы обработки видео и графики также могут использовать незарегистрированные компоненты DLL, которые приходится устанавливать вручную. Если эта операция заканчивается неудачно, это не приговор, и сегодня мы рассмотрим, что делать, если regsvr32 не смогла найти указанный модуль и завершилась аварийно.
Способы регистрации DLL в Windows
Регистрировать недостающие компоненты можно и с использованием консоли «Выполнить», но через командную строку это будет намного надёжнее. Все регистрируемые библиотеки помещаются в системный каталог, каковым для Windows 95/98/ME является system, для Windows XP/Vista/NT и более поздних 32-битных версий – system32, для 64-разрядных ОС – либо SysWOW64, либо system32. Все эти особенности нужно знать.
Но чаще всего ошибочное сообщение regsvr32 «Не удалось загрузить модуль» появляется из-за того, что у утилиты не было необходимых прав для выполнения некоторых операций, необходимых при регистрации компонент. Другими словами, вы запустили утилиту как обычный пользователь, не обладающий полномочиями администратора. К счастью, это легко исправимо.
Для этого в ранних версиях Windows (вплоть до «семёрки») необходимо кликнуть по кнопке «Пуск», выбрать пункт «Все программы», пролистать список вниз до подпункта «Стандартные» и найти там «Командную строку». Кликнуть по ней ПКМ и в появившемся контекстном меню выбрать пункт «Запуск от имени администратора».
В «восьмёрке» и «десятке» это выполняется проще, достаточно просто нажать кнопку «Пуск», найти «Командную строку» и щёлкнуть по ней ПКМ с выбором нужного аргумента.
Некоторые предпочитают запускать интерпретатор через проводник – в этом случае действия аналогичные: кликаем по файлу regsvr32.exe правой кнопкой мыши и выбираем опцию «Запуск от имени администратора».
Второй по частоте встречаемости причиной невозможности зарегистрировать нужную библиотеку или компоненту является ошибка с размещением этой компоненты. Даже опытные пользователи копируют нужный файл в каталог System32, просто по привычке. Для 64-разрядной версии Windows системной папкой, в которой размещаются все регистрируемые компоненты, является SysWOW64. Всё, что от вас потребуется, – убедиться, что вы скопировали библиотеку в нужную папку. И если это не так, исправить свою ошибку, а затем снова запустить командную строку с правами администратора и выполнить команду:
regsvr32.exe c: windows /system32/<полное имя регистрируемой библиотеки с расширением>
Второй способ не требует использования командной строки, поэтому он может оказаться предпочтительнее для неопытных пользователей. Приводим пошаговый алгоритм:
Если указанные действия не помогли, есть вероятность, что причина заключается в повреждённом файле regsvr32.exe или в появлении ошибок в системном реестре, связанных с работой этой утилиты. Чаще всего такие неприятности случаются при неправильном выключении компьютера, в том числе из-за пропадания электричества.
В таких случаях прибегают к помощи специализированного программного обеспечения, которое умеет находить подобные проблемы и самостоятельно исправлять их или предлагать пути решения. В качестве примера можно привести известную программу CCleaner, менее известный аналог Restoro и прочий софт аналогичной направленности.
Не помешает также проверить компьютер антивирусом, запустив полное сканирование, – файл regsvr32.exe может оказаться попросту заражённым.
А чтобы подобных проблем в будущем не возникало, не устанавливайте нелицензионное ПО, не игнорируйте защиту компьютера встроенными средствами безопасности и сторонними антивирусами и не допускайте его принудительного выключения.
Search code, repositories, users, issues, pull requests…
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up
3 способа регистрации библиотеки DLL для Win 10 x64 при ошибке regsvr32
После активации дополнительно установленных программ на персональное устройство (стационарное, портативное) пользователи могут столкнуться с разного рода неполадками. Если на мониторе ПК отобразилось уведомление о том, что обнаружена ошибка regsvr32 и необходимо провести регистрацию дополнительного файла DLL для блока Win10 х64, юзер не сможет завершить текущие операции и действия. Нужно проверить устройство и устранить сбой.
Как зарегистрировать файл DLL в Windows 10
Существует несколько вариантов решения проблемы, связанной с регистрацией документа DLL в операционной системе Windows 10. Начинать можно с любого подходящего способа. Если один не сработал, переходят к следующему.
С использованием «regsvr32.exe» в окне «Выполнить»
Командное окно «Выполнить» – стандартный инструмент, используемый пользователями Виндовс на 32 или 64 bit для устранения разного рода неполадок. Инструкция:
- вызвать рабочее поле, используя комбинацию горячих клавиш «Win» и «R», либо через раздел «Пуск»;
- в пустую строку ввести команду и путь регистрации необходимого файла: exe C:\Windows\System32\dllname.dll;
- подтвердить запрос кнопкой «ОК» или «Enter».
Внимание! Если нужный документ находится не на диске С, используют запрос %systemroot%\System32\regsvr32.exe %windir%\System32\dllname.dll. В данном случае операционка самостоятельно определяет папку расположения блоков ОС.
По завершении процедуры, которая займет некоторое время, на мониторе ПК отобразится уведомление о текущем результате выполнения команды.
Через Командную строку
Регистрация библиотеки через Command Line осуществляется следующим образом:
- запустить панель «Выполнить» (с помощью горячих клавиш или кнопки «Пуск»);
- в пустое поле вводится запрос «cmd» и затем «ОК»;
- откроется окно черного цвета, где требуется ввести команды из предыдущей инструкции.
Для ввода значений можно использовать функцию копирования и вставки скопированных строк.
Использование «Открыть с помощью»
Чтобы использовать данный инструмент, необходимо открыть папку System32. Затем выполнить несколько последовательных шагов:
- по файлу audiosrv кликнуть правой клавишей мышки, откроется дополнительное меню действий;
- нажать строку «Открыть с помощью»;
- выбрать пункт «Обзор», затем – программу System32 или SysWow64 (в зависимости от разрядности действующей операционки).
С помощью указанного приложения требуется запустить DLL, после чего операционная система должна произвести определенные процедуры и отобразить уведомление об успешности завершения процесса.
Почему не удается зарегистрировать DLL
В некоторых случаях зарегистрировать нужную библиотеку не удается из-за наличия других неисправностей или ошибок. Основные варианты:
- несовместимость документа с установленной операционкой – нужно проверить разрядность активируемого файла (64 или 32);
- отсутствует точка входа – некоторые DLL не настроены на работу с командами типа DllRegisterServer.
Внимание! Иногда сайты, позволяющие скачать необходимые регистры, выдают за рабочие файлы документы, зараженные вирусами или не являющимися библиотеками. Такие блоки зарегистрировать невозможно.
Регистрация дополнительных рабочих библиотек DLL выполняется с помощью Командной строки, окна «Выполнить» или запроса «Открыть с помощью». Ошибку с активацией можно устранить самостоятельно, без обращения к мастеру. Важно четко выполнять инструкции и корректно вводить командные запросы, в противном случае можно внести изменения, которые будет сложно исправить.
Модуль загружен, но dllregisterserver не удалось найти точку входа 6 решений проблемы
Крайне неприятная ошибка в Windows «Модуль загружен, но точка входа DLLRegisterServer не найдена» связана, как правило, с некорректным функционированием динамически подключаемой библиотеки (сокр., «.dll»), к которой обращается программа в процессе своей работы. В результате встроенный в Windows процесс отвечающий за регистрацию библиотеки в ОС, отказывается ее принять либо не может найти. А программа, обращающаяся к неработающим модулям, соответственно, не функционирует. Потому, предлагаю разложить по полочкам данную проблему для того, чтобы понять, каким образом ее можно исправить.
Что значит, DllRegisterServer не удалось найти точку входа?
Данный сбой имеет прямую зависимость от картотеки системы, которая является комплексом определённых приложений, которые необходимы, чтобы выполнить разнообразные операции на ПК. Также данный элемент называют модулем. Каждый из них осуществляет некий набор опций. К примеру, открывает диалоговые окна или производит подсчёт с помощью калькулятора. Данные операции являются стандартными, для выполнения которых пишется определённый код.
Пакеты .dll можно назвать общими. Их специфика:
- Элементы могут активироваться сразу несколькими программами;
- Загружаются элементы на автомате сразу, как только последует запрос от приложения;
- Подобные пакеты практически не используют ресурс компьютера.
Давайте отметим недостатки этой библиотеки:
- Когда часть элементов отсутствуют, или в них есть неполадки, программы, которые используют битые элементы, начинают функционировать со сбоями или вообще не работают;
- Если пользователь поменяет настройки части таких элементов, то возможно, что зависящие от них программы просто перестанут функционировать:
- Файлы таких модулей уязвимы в связи с тем, что им даётся один адрес от ОС.
Когда на дисплее монитора появилась надпись «Модуль загружен» без точки входа, получается, что внутри картотеки DLL есть сбой – произошло удаление или повреждение определённого элемента, или же сбой повредил регистрацию и прочее.
Суть проблемы
Dll-файл — это набор разных команд, процедур и функций. Команда «regsvr32 «имя файла».dll» вызывает функцию DllRegisterServer, которая вшита в нужный нам файл. Но проблема в том, что далеко не во всех файлах присутствует эта функция. Также она может стереться при повреждении. Не найдя этой функции, система сообщает об ошибке.
ВАЖНО: Такой алгоритм действий абсолютно стандартный, так как чаще всего в библиотеках файлов dll данная функция всё таки присутствует.
Исправляем данный сбой
Для устранения неисправности отдельной части картотеки, нужно произвести закачку подобного элемента и установку его.
Важно! Производить закачки элементов нужно лишь с основных ресурсов. Скачивание элементов с неизвестных сайтов может заразить ваш компьютер различными вредителями. В связи с этим возможны различные ошибки.
Разрядность приложения должна быть такой же, как у ОС (32 bit или 64 bit). Если вы установите элемент не той разрядности, то данный сбой не исчезнет. Те элементы, которые вы скачали, нужно переместить в определённые папочки ОС Виндовс — SysWOW64, System32. После этого, данные файлы требуют регистрации. Ниже я покажу, как это делается.
Причины возникновения
Такая проблема может распространяться как на все dll-файлы, так и на определённые.
В первом случае сбой может быть спровоцирован вирусом или программой-шпионом. Некоторые вредоносные программы намеренно удаляют некоторые файлы библиотеки dll, из-за чего нарушается целостность. Это влечёт за собой сбои во всей библиотеке, так как обрываются некоторые связи, восстанавливать которые приходится вручную.
Если проблема распространяется только на один конкретный dll-файл, то всему виной некачественная сборка. Часто это может случиться при скачивании неофициального патча для игры или сделанного на «коленке» репака с торрентов.
Регистрируем dll с помощью командной строки
- Итак, кликнем по кнопочке «Пуск» и среди плиток, находим «Командная строка»;
- Кликнем по ней ПКМ и в ниспадающем меню выберем «Дополнительно», затем в новом окошке «Запуск от имени администратора»;
Теперь нужно немного подождать, чтобы команда выполнилась.
Регистрация с применением утилиты «Выполнить»
- Регистрируем с помощью утилиты «Выполнить»;
- Нажмём кнопочки Win+R и в появившееся окошко вставим сочетание RegSvr32.exe C:\Windows\SysWOW64\thumbcache.dll
Если вам не удалось решить проблему, то можно ввести в «Командную строку», также как администратор, следующее сочетание:
RegSvr32.exe C:\Windows\SysWOW64\thumbcache.dll (или путь по вашему адресу) и нажать ввод.
Опять нужно немного подождать, для решения этой проблемы. Если метод не сработал, можно убрать кавычки и ввести заново.
Как запустить отладку
Если не получается зарегистрировать и загрузить модуль, необходимо запустить отладку. С ее помощью можно самостоятельно убедиться в отсутствии или наличии проблем с двоичным кодом.
Отладка файла позволяет ознакомиться с его двоичным кодом
Чтобы запустить процесс отладки, придется воспользоваться исполнительным файлом «inetinfo.exe». При этом необходимо придерживаться следующих рекомендаций:
- DLL не может выполняться сам по себе. Для его дальнейшей отладки надо запускать приложение, использующее этот файл. Полный путь к нему придется вручную указать в настройках программы;
- в процессе отладки надо проследить за тем, чтобы отладчик правильно загружал двоичные символы DLL;
- чтобы во время отладки все прошло без проблем, файл добавляется в Additional DLLs.
Если появилось сообщение «Точка входа DLLRegisterServer не найдена» в Windows 10 или 7, не стоит опускать руки, все поправимо. Эти ОС часто подвержены появлению данной ошибки. Чтобы быстро избавиться от данной проблемы, можно воспользоваться описанными выше способами.
DllRegisterServer не выполняет вызов из-за ошибки 0x80070005
Попробуем выключить контролирование учеток (UAC).
Запомните. Если вы выключите «Учётные записи», то безопасность ОС нарушится. Отсюда, завершив операцию, желательно вновь произвести включение учетных записей.
Итак, нам нужна «Командная строка» запущенная как администратор. Вводим сочетание:
reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f
Производим перезагрузку ПК и проверяем, исчез ли сбой?
Надеюсь, всё прошло успешно. Если так, то нужно вновь включить UAC. Разумеется, нам для этого опять потребуется «Командная строка». Введём сочетание:
reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 1 /f
Нужна опять перезагрузка.
Сломан ваш ПК и у вас пропала возможность на нём нормально работать? Это не проблема. Нужно обратиться в наш центр по ремонту компьютеров. Мы проведём диагностику и устраним неисправность. Для нас является важным, чтобы ваш ПК продолжал отлично функционировать, и чтобы ничто не отвлекало вас от занятия любимым делом: Наше предложение: 1 Бесплатный выезд специалиста; 2 Бесплатный анализ компьютера у вас дома; 3 Мы даём гарантию после ремонта до трёх лет; 4 Выдаём чек с гарантийным талоном. Вам достаточно оставить заявку, и мы предоставим вам скидку на 15%
Установка обновлений Windows вручную
Если автоматическую установку обновлений выполнить так и не удалось, можно вручную загрузить требуемое обновление или пакет обновлений в каталоге Центра обновления Майкрософт. Судя по дизайну сайта, сделан он очень давно, и Microsoft советует использовать Internet Explorer для захода на сайт.
К счастью, делать этого не обязательно — любое обновление нормально загружается через любой современный браузер. В каталоге Центра обновлений должны быть все выпущенные обновления для всех версий Windows.
Ручная установка обновлений на Windows 7, 8 и 10:
В зависимости от обновления, после установки может потребоваться перезагрузка компьютера, чтобы все изменения вступили в силу. Установленные пакеты обновлений должны пропасть из Центра обновлений, в противном случае надо повторно запустить проверку доступных обновлений.
Из-за чего может не получиться зарегистрировать DLL?
Данные элементы система может отказаться регистрировать по следующим причинам:
- Библиотека была зарегистрирована до этого – нужно исправить или удалить эти элементы;
- Загруженная библиотека оказалась пустой или несовместимой с установленной ОС;
- Файл не может быть зарегистрирован, т.к. не предназначен для регистрации.
В чём суть ошибки «Модуль загружен»?
Итак, объяснение смысла данной ошибки закономерно будет начать с определения «библиотеки«. Библиотека или в некоторых языках программирования, модуль (модули) — это набор подпрограмм, используемых в разработке программного обеспечения. Проще говоря, это совокупность небольших и независимых блоков, каждый из которых является функционально законченным фрагментом кода.
Для чего они предназначены? Существует огромное количество подпрограмм или процедур, выполняющих самые разные задачи. Некоторые из них содержат стандартные для многих программ вычислительные операции. К примеру, открытие диалоговых окон в Windows или нахождение квадратного корня из любого числа — это стандартные, часто встречающиеся процедуры. Так вот, чтобы не писать код таких подпрограмм каждый раз при создании ПО, были придуманы заранее заготовленные файлы, которые получили название «библиотеки». С помощью специальной функции их можно подключить к программе, при этом исполнимый код этой библиотеки не будет внедряться в код приложения, что позволяет сэкономить память ПК.
Динамические библиотеки DLL, встраиваемые в Windows, принадлежат к модулям общего пользования (shared library). Отличительные их особенности для пользователя состоят в следующем:
К сожалению, у DLL модулей есть и недостатки. Не будем говорить о так называемом «DLL Hell», так как на данный момент, несмотря на нарушение самого идейного принципа динамических библиотек общего пользования, разработчики Microsoft разрешили эту проблему. Гораздо важнее в данной статье отметить следующие недостатки:
Теперь о том, что такое точка входа. Точкой входа называется адрес в оперативной памяти, по которому хранится первая команда программы. На самом деле, функций в одной библиотеке может быть несколько и каждая из них имеет свою точку входа, к которой и обращается процесс, вызывающий определенную подпрограмму.
Таким образом, скомпоновав все вышеописанное в единое целое, мы можем раскрыть суть ошибки «Модуль загружен». Эта проблема возникает при регистрации библиотеки в системе. Процесс «Regsvr32.exe», отвечающий за инсталлирование интерфейсов объектов в ОС, не может обнаружить функцию регистрации библиотеки «DLLRegisterServer» в проблемном dll.
Рассмотрев основные причины, по которым возникают неполадки с видимостью ОС библиотеки, можно перейти к путям их разрешения.
Файл DLL – компонент динамически подключаемой библиотеки, чьи элементы используют практически все программы. Библиотека DLL файлов расположена в корневой папке системы. Компоненты должны быть все в наличии, иметь цифровую подпись, правильно работать и быть актуальными по версии. Если одно из требований не соблюдено, при запуске программы пользователь получит информационное уведомление: ошибка DLL. Неисправность свидетельствует о том, что отсутствует DLL файл, поврежден или устарел.
Как установить DLL файл
Чтобы программы, приложения и игры снова начали работать, необходимо установить вручную недостающие компоненты библиотеки. Просто поместить файл в папку недостаточно ─ нужно знать как их зарегистрировать.
Помещение и регистрация файлов библиотеки
Перед тем как установить DLL файл на Windows 7,8,10, их нужно скачать, причем точно под разрядность системы.
Давайте определим, какая разрядность у Вашей системы (если вы точно знаете, может пропустить этот шаг)
Шаг 1. Кликаем правой кнопкой мыши по «Мой компьютер» и выбираем «Свойства»
Шаг 2. В открывшемся окне, мы может прочитать свойства компьютера, версию операционной системы и её разрядность 32 (х86) или 64 бит. В нашем случаи стоит 64-разрядная операционная система Windows 10.
·
Шаг 3. После скачивания файлов их нужно поместить в корневую папку, зарегистрировать
для х32 (х86) систем компонент необходимо заменить или поместить в папку C:\Windows\System32;
для х64 необходимо выполнить замену или переместить в папку C:\Windows\ SysWOW64;
Шаг 4. Файл нужно зарегистрировать в системе.
Сделать это можно, открыв командную строку комбинацией «Win» + «R», или нажать «Пуск» и «Выполнить»;
в открывшемся окне ввести через пробел следующее: regsvr32 имя файла.dll – где, «regsvr32» ─ команда для регистрации, а «имя файла.dll» – полное имя вставленного компонента;
или же можно прописать расположение файла вручную — regsvr32.exe + путь к файлу
Шаг 5. Нажмите «ОК», и перезагрузите компьютер, и новые параметры вступят в силу.
Сразу хочется отметить, что при регистрации возможны появления ошибок. Например: «Не удалось загрузить модуль». Обычно они возникают по 3 причинам
- Не правильно прописан путь к файлу, или файл не был перемещен в каталог System32 или SysWOW64
- Не все файлы DLL вообще нуждаются в регистрации, иногда достаточно просто скопировать их в каталок System32 или SysWOW64 или поместить в корень проблемной игры или программы
- Файлы уже были зарегистрированы ранее
Второй способ регистрации
Шаг 1. Зарегистрировать файл можно с помощью командой строки, которую нужно запустить от имени администратора.
Шаг 2. Пишем команду regsvr32.exe + путь к файлу и жмём «Enter»
Шаг 3. Появится сообщение что «Всё прошло удачно», и просто перезагружаем компьютер
Вот и всё, файл зарегистрирован, можете пробовать запускать вашу игру или программу
Как зарегистрировать DLL в Windows
Среди частых вопросов пользователей, особенно после того, как они сталкиваются с тем, что какая-то из библиотек DLL отсутствует в Windows 10, Windows 11 или других версиях системы — как зарегистрировать DLL в соответствующей версии ОС.
В этой инструкции подробно о способах регистрации библиотек DLL в Windows x64 и x86 (32-бит) с помощью regsvr32.exe (и кратко о regasm.exe), о возможных нюансах и проблемах, которые могут возникнуть в процессе.
Регистрация библиотеки DLL в Windows 10, Windows 11 и предыдущих версий системы
Дальнейшие шаги описаны в предположении, что 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.
Сам процесс регистрации в общем случае состоит из следующих шагов:
- Нажмите клавиши Win+R на клавиатуре (Win — клавиша с эмблемой Windows). Также можно нажать правой кнопкой мыши по кнопке «Пуск» в Windows 11 или Windows 10 и выбрать пункт контекстного меню «Выполнить».
- Введите команду regsvr32.exe путь_к_файлу (если путь к файлу содержит пробелы, возьмите весь путь в кавычки), например, для регистрации библиотеки DLL COMCNTR.DLL в 1С (для 64-бит) команда может иметь вид:Если DLL находится в System32, полный путь указывать не обязательно, достаточно простого имени файла, как на изображении ниже.
- Нажмите Ок или Enter.
- При успехе вы получите сообщение вида «Успешное выполнение DllRegisterServer в имя_файла.dll» или «Успешное выполнение DllRegisterServer и DllInstall в имя_файла.dll».
Возможна и неудача — сообщение об ошибке «Модуль dll загружен, но точка входа DllRegisterServer не найдена. Проверьте, что файл является правильным файлом DLL или OCX и повторите попытку». Подробнее об ошибке — в следующем разделе статьи.
Дополнительно: для регистрации классов из библиотек DLL .NET Framework в COM с созданием необходимых записей в реестре используется regasm.exe из .NET SDK, причем базовая команда регистрации DLL выглядит тем же образом, что и в случае с regsvr32.exe. Подробнее по использованию regasm — https://docs.microsoft.com/ru-ru/dotnet/framework/tools/regasm-exe-assembly-registration-tool.
Почему не удается зарегистрировать DLL
Ошибка при регистрации с помощью regsvr32 вида «Точка входа DllRegisterServer не найдена» говорит о том, что эта библиотека DLL не поддерживает регистрацию описанным методом. Можно попробовать использовать вариант команды:
но с большой вероятностью и это не поможет.
У большинства домашних пользователей такая проблема возникает при регистрации файлов DLL для игр и программ, часто не вполне лицензионных, которые сообщили, что нужный файл DLL не обнаружен или отсутствует. Причем сами библиотеки DLL обычно скачаны со сторонних сайтов (и чаще всего имеют имена начинающиеся с «vc», «msvc» или «d3d»). А решение, как правило, простое — выяснить, частью какого набора компонентов является эта DLL и установить эти компоненты с помощью их собственного установщика. Более подробно проблема и подходы к решению описаны в инструкции Точка входа DllRegisterServer не найдена — причины и возможные решения.
Видео
Надеюсь, цель достигнута, а количество вопросов, связанных с регистрацией DLL в Windows, уменьшилось.