Register DLL and ActiveX controls from a Delphi application

A popular feature of Delphi so popular is the project deployment of an application with an executable file (exe).  However, if the DLL or ActiveX controls in your project are not registered on the users’ machines, an “EOleSysError” will be displayed in response to running the exe file.  To avoid this, use the regsvr32.exe command-line tool.

RegSvr32.exe
Manually using regsvr32.exe (Windows.Start - Run) will register and unregister self-registerable  DLL and ActiveX controls on a system.

Regsvr32.exe instructs the system to attempt to load the component and call its DLLSelfRegister function. If this attempt is successful, Regsvr32.exe displays a dialog indicating success.

RegSvr32.exe has the following command-line options: 

Regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname
/s - Silent; display no message boxes
/u - Unregister server
/i - Call DllInstall passing it an optional [cmdline]; 
when used with /u calls dll uninstall
/n - do not call DllRegisterServer; this option must       be used with /i 

Call RegSvr32.exe Within Delphi code

To call the regsvr32 tool within Delphi code, use the “RegisterOCX” function to execute a file and wait for the execution to finish.

This is how the 'RegisterOCX' procedure could look:

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('Unable to register %s', [ocxPath]));
 end;
end;

Note: the ocxPath variable points to the 'Flash.ocx' Macromedia OCX.

To be able to register itself, an OCX must implement the DllRegisterServer function to create registry entries for all the classes inside the control. Do not worry about the DllRegisterServer function, just make sure it is there. For the sake of simplicity, it is presumed that the OCX is located in the same folder as where the application is.

The ExecAndWait line in the above code calls the regsvr32 tool by passing the "/s" switch along with the full path to the OCX. The function is 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;

The ExecAndWait function uses the ShellExecuteEx API call to execute a file on a system. For more examples of executing any file from Delphi, check out the Start from Delphi article.

Flash.ocx inside Delphi exe
If there is a need to register an ActiveX control on the  user’s machine, then make sure the user has the OCX the program requires by placing the entire ActiveX (or DLL) inside the application’s exe as a resource.

When the OCX is stored inside the exe, it is easy to extract, save to disk, and call the RegisterOCX procedure.