分发使用ActiveX控件的Delphi Application

时间:2010-05-29 01:44:07

标签: delphi activex

使用delphi应用程序打包activex dll的最佳方法是什么? 如果我只是编译它,当我将它发送给其他人时,它会给出错误,因为它们没有注册ActiveX dll。

2 个答案:

答案 0 :(得分:3)

您应该做的是创建一个安装程序。有几个程序可以让你这样做。我更喜欢InnoSetup,它是开源的,用Delphi编写,效果很好。只需将您的ActiveX DLL放入安装包中,然后告诉InnoSetup它需要去的地方(在与您的应用程序相同的文件夹中,在Sys32中,或在少数其他预定义的位置),它会处理剩下的事情。对你而言。

答案 1 :(得分:1)

当我在运行时创建COM服务器时,我使用了某事。如下所示。想法是捕获“未注册的类”异常并尝试即时注册服务器。通过一些搜索,您还可以找到读取类标识符注册表的示例,以确定是否已注册activex服务器...我将示例改编为某些“MS Rich Text Box”(richtx32.ocx),但它不会没有区别。

uses
  comobj;

function RegisterServer(ServerDll: PChar): Boolean;
const
  REGFUNC          = 'DllRegisterServer';
  UNABLETOREGISTER = '''%s'' in ''%s'' failed.';
  FUNCTIONNOTFOUND = '%s: ''%s'' in ''%s''.';
  UNABLETOLOADLIB  = 'Unable to load library (''%s''): ''%s''.';
var
  LibHandle: HMODULE;
  DllRegisterFunction: function: Integer;
begin
  Result := False;
  LibHandle := LoadLibrary(ServerDll);
  if LibHandle <> 0 then begin
    try
      @DllRegisterFunction := GetProcAddress(LibHandle, REGFUNC);
      if @DllRegisterFunction <> nil then begin
        if DllRegisterFunction = S_OK then
          Result := True
        else
          raise EOSError.CreateFmt(UNABLETOREGISTER, [REGFUNC, ServerDll]);
      end else
        raise EOSError.CreateFmt(FUNCTIONNOTFOUND,
            [SysErrorMessage(GetLastError), ServerDll, REGFUNC]);
    finally
      FreeLibrary(LibHandle);
    end;
  end else
    raise EOSError.CreateFmt(UNABLETOLOADLIB, [ServerDll,
        SysErrorMessage(GetLastError)]);
end;

function GetRichTextBox(Owner: TComponent): TRichTextBox;
begin
  Result := nil;
  try
    Result := TRichTextBox.Create(Owner);
  except on E: EOleSysError do
    if E.ErrorCode = HRESULT($80040154) then begin
      if RegisterServer('richtx32.ocx') then
        Result := TRichTextBox.Create(Owner);
    end else
      raise;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  [...]
  RichTextBox := GetRichTextBox(Self);
  RichTextBox.SetBounds(20, 20, 100, 40);
  RichTextBox.Parent := Self;
  [...]
end;