Шаг 34 - Регистрация компонент RegSrv32

Создавая элементы ActiveX рано или поздно станет вопрос о том как переносить эти компоненты на другой компьютер. Действительно собрав и скомпилировав элемент на своем компьютере мы автоматически его регистрируем. Есть два варианта. Первый - это создать REG файл и при переносе компонента вносить данные в реестр используя этот файл. Второй способ основан на том, что элемент ActiveX умеет сам себя регистрировать используя утилиту RegSrv32.exe. С ее помощью регистрируется элемент и удаляются сведения о регистрации очень просто.

Регистрация:

	
regsrv32 путь\имя_файла_елемента

Отмена регистрации:

regsrv32 /u  путь\имя_файла_елемента

Как это происходит ??? В элементе есть функция DllRegisterServer, которая и умеет регистрировать Ваш элемент. RegSrv32 вызывает эту функцию. Вы можете сами написать процедуру регистрации элемента. Алгоритм такой:

  1. используйте LoadLibrary API Windows, чтобы загрузить DLL
  2. используйте GetProcAddress, чтобы получить адрес функции DllRegisterServer
  3. вызовите функцию DllRegisterServer

А вот пример кода без обработок ошибок.

HINSTANCE hLib = LoadLibrary("My.Dll");
(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, _T("DllRegisterServer"));
(*lpDllEntryPoint)();

Что представляет функция DllRegisterServer в элементе ActiveX ? Вот она:

////////////////////////////////////////////////
// DllRegisterServer - Adds entries to the system registry

STDAPI DllRegisterServer(void)
{
	AFX_MANAGE_STATE(_afxModuleAddrThis);

	if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
		return ResultFromScode(SELFREG_E_TYPELIB);

	if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
		return ResultFromScode(SELFREG_E_CLASS);

	return NOERROR;
}

//////////////////////////////////////////////////
// DllUnregisterServer - Removes entries from the system registry

STDAPI DllUnregisterServer(void)
{
	AFX_MANAGE_STATE(_afxModuleAddrThis);

	if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
		return ResultFromScode(SELFREG_E_TYPELIB);

	if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
		return ResultFromScode(SELFREG_E_CLASS);

	return NOERROR;
}

За Вас ее пишет AppWizard.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 31.10.2000