Внешний вид сайта:

Регистрация DLL и ActiveX

Вы знаете как зарегистрировать OLE управление типа динамической библиотеки (DLL) или управление ActiveX (OCX файлы) из приложения Delphi? Одна из особенностей, которые делают Delphi популярным — это в большинстве случаев при проектировании приложения получается всего один исполняемый файл, который нужно отдать заказчику.

Однако, в некоторых ситуациях, например, когда Вы импортируете управление 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 для запуска файла.

Комментарии

Нет комментариев. Ваш будет первым!