Регистрация DLL и ActiveX
Однако, в некоторых ситуациях, например, когда Вы импортируете управление ActiveX в Ваш проект, Вы должны будете удостовериться, что это управление ActiveX зарегистрировано на машинах Ваших пользователей. Если управление не зарегистрировано, будет вызвано исключение EOleSysError.
RegSvr32.exe
Regsvr32.exe - инструмент, который из командной строки регистрирует DLL и управления ActiveX в системе. Вы можете вручную использовать Regsvr32.exe (Windows.Пуск->Выполнить...) чтобы зарегистрировать или убрать регистрацию управления OLE типа DLL плп управления ActiveX, которые являются саморегистрируемыми.
Когда Вы используете Regsvr32.exe, это пытается загрузить компонент и вызвать функцию DLLSelfRegister. Если попытка успешная, Regsvr32.exe отображает окно с сообщением об успешной регистрации.
Regsvr32.exe имеет следующие опции командной строки:
Regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname /s - Тихо; не отображать сообщения /u - Снять регистрацию /i - Вызов DllInstall с передачей ей необязательной [cmdline]; когда используется с /u /n - Не вызывать DllRegisterServer; эта опция должна использоваться с /i
В коде Delphi
Чтобы вызвать инструмент Regsvr32.exe изнутри кода Delphi, нужна функция, которая может запустить файл на выполнение и ждать, когда он закончит работу.
Вот как может выглядеть процедура RegisterOCX:
procedure RegisterOCX; type TRegFunc = function : HResult; stdcall; var ARegFunc : TRegFunc; aHandle : THandle; ocxPath : string; begin try ocxPath := ExtractFilePath(Application.ExeName) + 'Flash.ocx'; aHandle := LoadLibrary(PChar(ocxPath)); if aHandle <> 0 then begin ARegFunc := GetProcAddress(aHandle,'DllRegisterServer'); if Assigned(ARegFunc) then begin ExecAndWait('regsvr32','/s ' + ocxPath); end; FreeLibrary(aHandle); end; except ShowMessage(Format('Не могу зарегистрировать %s', [ocxPath])); end; end;
Обратите внимание: переменная ocxPath указывает путь к Flash.ocx управлению ActiveX.
Чтобы быть способным зарегистрироваться, управление ActiveX должна осуществить функцию DllRegisterServer. Иными словами, эта функция создает записи в системном реестре для всех классов управления. Мы не должны волноваться относительно функции DllRegisterServer, мы просто должны удостовериться, что она есть. Ради простоты, мы предположим, что управление ActiveX (.OCX файл) расположено в той же самой папке, что и Ваше приложение.
В строке ExecAndWait('regsvr32','/s ' + ocxPath); в коде выше вызывается Regsvr32.exe, которой передается переключатель /s (не отображать сообщения) и полный путь к управлению ActiveX.
Функция ExecAndWait:
uses shellapi; { ... } function ExecAndWait(const ExecuteFile, ParamString : string): boolean; var SEInfo: TShellExecuteInfo; ExitCode: DWORD; begin FillChar(SEInfo, SizeOf(SEInfo), 0); SEInfo.cbSize := SizeOf(TShellExecuteInfo); with SEInfo do begin fMask := SEE_MASK_NOCLOSEPROCESS; Wnd := Application.Handle; lpFile := PChar(ExecuteFile); lpParameters := PChar(ParamString); nShow := SW_HIDE; end; if ShellExecuteEx(@SEInfo) then begin repeat Application.ProcessMessages; GetExitCodeProcess(SEInfo.hProcess, ExitCode); until (ExitCode <> STILL_ACTIVE) or Application.Terminated; Result:=True; end else Result:=False; end;
Функция ExecAndWait использует вызов ShellExecuteEx API для запуска файла.
Комментарии