2010-06-16 1 views
7

Почему существует разница в регистрации COM-компонента для 32-разрядных и 64-разрядных ОС? На 32-битных ОС:В чем разница между RegSvr и RegServer?

RegSvr32 COM.exe 

или

RegSvr32 COM.dll 

На 64-битных ОС:

COM.exe /RegServer 
COM.exe /RegSvr 

Являются ли эти одинаковыми или различными, если они отличаются, почему/как?

+3

Имейте в виду, что regsvr32 работает для DLL-файлов, но для exe-файлов вам необходимо использовать/regserver-переключатель – DarkSide

+0

Как мы можем проверить, COM-компонент зарегистрирован успешно? – Ram

ответ

1

Существуют существенные различия в 32- и 64-разрядном реестре.

Windows 64-bit registry v.s. 32-bit registry

Более конкретно, вы не можете зарегистрировать 64-битную DLL с regsvr32.

http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/f8898224-76ca-4047-90d3-20c63f71a2d8/

+0

Ответ неправильный и вводящий в заблуждение. 32/64 бит реестра детали не связаны с вопросом. Да, вы можете зарегистрировать 64-битную DLL с regsvr32, более того, это делается простым способом. –

4

COM-серверы регистрируются так же, как в 32- разрядных 64-разрядных операционных систем. Вопрос связан с самостоятельной регистрацией, самым простым способом регистрации COM-сервера - путем запроса сервера для обновления реестра HKLM/HKCR соответственно.

Поскольку вы не можете напрямую запускать DLL, вы используете приложение-помощник regsvr32. Чтобы сократить длинную историю, выясняется, является ли DLL 32- или 64-разрядной и использует соответствующую версию приложения. Затем он загружает DLL и передает управление для регистрации.

Серверы EXE COM могут запускаться напрямую, так что это то, что вы передаете им/regserver или/unregserver.

Методы действительны для 32- и 64-разрядных COM-серверов для 32- и 64-разрядных операционных систем.

Дальнейшее чтение - Self-Registration:

Если сервер упакована в модуле DLL, то DLL должен экспортировать функции DLLRegisterServer и DllUnregisterServer. Любое приложение, которое хочет поручить серверу регистрироваться (то есть все его идентификаторы CLSID и идентификаторы библиотеки типов), может получить указатель на DllRegisterServer через функцию GetProcAddress. Внутри DllRegisterServer DLL создает все необходимые записи реестра, сохраняя правильный путь к DLL для всех записей InprocServer32 или InprocHandler32.

Когда приложение хочет удалить компонент из системы, оно должно отменить регистрацию этого компонента, вызвав DllUnregisterServer. Внутри этого вызова сервер удаляет именно те записи, которые он ранее создал в DllRegisterServer. Сервер не должен слепо удалять все записи для своих классов, потому что другое программное обеспечение может хранить дополнительные записи, такие как ключ TreatAs.

Если сервер упакован в модуль EXE, приложение, желающее зарегистрировать сервер, запускает EXE-сервер с аргументом командной строки/RegServer или -RegServer (без учета регистра). Если приложение хочет отменить регистрацию сервера, он запускает EXE с аргументом командной строки/UnregServer или -UnregServer. Саморегистрационный EXE обнаруживает эти аргументы командной строки и вызывает те же операции, что и DLL, в DllRegisterServerand DllUnregisterServer, соответственно, регистрируя свой путь к модулю в LocalServer32 вместо InprocServer32 или InprocHandler32.