2

我正在尝试在 Delphi 程序中注册一个 Active X .ocx 库,我尝试了以下代码,但没有成功,没有错误,程序运行所有代码,但完成后 Active X 库尚未注册。我究竟做错了什么 ?

    procedure RegisterOCX;
    type
      TRegFunc = function : HResult; stdcall;

    var
      ARegFunc : TRegFunc;
      aHandle  : THandle;
      ocxPath,AppPath  : string;
      begin
      GetDir(0, AppPath);
       try
        ocxPath := AppPath + '\VOIP.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('Unable to register ');
        end; 
      end;

    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;   
4

1 回答 1

2

使用 regsvr32 让您的生活变得艰难。您已经完成了 99% 的无操作。而不是调用 regsvr32,只需调用DllRegisterServer. 毕竟,这就是 regsvr32 要做的一切!

您的代码变为:

if Assigned(ARegFunc) then
  OleCheck(ARegFunc());

然后,您可以ExecAndWait完全删除。这很好,因为它让我不用讨论繁忙的循环和泄露的句柄!

将您调用的变量重命名ARegFuncDllRegisterServer. 所以代码可能看起来像这样:

aHandle := LoadLibrary(PChar(ocxPath));
if aHandle = 0 then
  RaiseLastWin32Error;
try
  DllRegisterServer := GetProcAddress(aHandle,'DllRegisterServer');
  if Assigned(DllRegisterServer) then
    OleCheck(DllRegisterServer());
finally
  FreeLibrary(aHandle);
end;

调用最可能的失败模式DllRegisterServer是无法运行提升的注册码。

顺便说一句,LoadLibrary返回HMODULE而不是THandle.

于 2013-11-13T06:38:34.320 回答