2014-04-17 123 views
0

我有這個代碼在Windows上註冊一個OCX。可以使用相同的代碼來註冊一個ActiveX DLL嗎?從Delphi應用程序註冊Activex DLL

請注意,程序在嵌入適當的清單後運行。

program RegOCX; 

{$APPTYPE CONSOLE} 
{$R *.res} 
{$R RegOCX.rec} 

uses 
    System.SysUtils, Vcl.OleCtnrs, OleCtl, Windows; 

function CheckOCXReg: Boolean; 
var 
    X: TOleContainer; 
begin 
    Result := True; 

    X := TOleContainer.Create(nil); 
    try 
    try 
     X.Parent := nil; 
     X.CreateObject('KSDHTMLEDLib.KSEditX', False); 
    except 
     Result := False; 
    end; 
    finally 
    X.Free; 
    end; 

end; 

procedure RegisterOCX; 
var 
    OCXFl: String; 
    OCXHandle: THandle; 
    RegFunc: TDllRegisterServer; 
begin 
    OCXFl := ExtractFilePath(ParamStr(0)) + 'KsDHTMLEDLib.ocx'; 

    if not FileExists(OCXFl) then 
    begin 
    WriteLn('Fatal Error - OCX file does not exist! Press Enter to continue..'); 
    Readln; 
    Exit; 
    end; 

    OCXHandle := LoadLibrary(PChar(OCXFl)); 
    try 
    if OCXHandle = 0 then 
    begin 
     WriteLn('Error registering OCX! Press Enter to continue..'); 
     Readln; 
    end 
    else 
    begin 
     RegFunc := GetProcAddress(OCXHandle, 'DllRegisterServer'); 
     if RegFunc <> 0 then 
     begin 
     WriteLn('Error registering OCX! Press Enter to continue..'); 
     Readln; 
     end; 
    end; 
    finally 
    FreeLibrary(OCXHandle); 
    end; 

end; 

begin 
    try 
    { TODO -oUser -cConsole Main : Insert code here } 
    RegisterOCX; 
    except 
    on E: Exception do 
    begin 
     WriteLn(E.ClassName, ': ', E.Message); 
     Readln; 
    end; 
    end; 

end. 
+1

有包括德爾福TRegSvr樣本,看一看。 –

回答

1

ActiveX控件通常在.dll或.ocx文件中實現。他們通過自己的DllRegisterServer功能進行自我註冊。這就是你的代碼所做的。

您測試DllRegisterServer返回值的方式稍微偏離了一點。還有其他一些可以改進的地方。我想有這樣的代碼:

var 
    hMod: HMODULE; 
.... 
hMod := LoadLibrary(PChar(OCXFl)); 
if hMod = 0 then 
begin 
    WriteLn('Error registering OCX! Press Enter to continue..'); 
    Readln; 
    exit; 
end; 
try 
    RegFunc := GetProcAddress(hMod, 'DllRegisterServer'); 
    if not Assigned(RegFunc) then 
    begin 
    WriteLn('Error registering OCX! Press Enter to continue..'); 
    Readln; 
    exit; 
    end; 
    if not Succeeded(RegFunc()) then 
    begin 
    WriteLn('Error registering OCX! Press Enter to continue..'); 
    Readln; 
    exit; 
    end; 
finally 
    FreeLibrary(hMod); 
end; 

雖然我可能更喜歡稍微不同的錯誤報告機制,我都堅持用你的方法。

1

或者嘗試直接在清單中嵌入註冊信息:

<file name="path\\some.ocx"> 
    <comClass description="some OCX" clsid="{OCX CLSID}" 
     progid="ocx.prog.etc" threadingModel="apartment" /> 
    </file>