bestlong 怕失憶論壇
標題:
如何在程式中註冊 OCX/ActiveX/DLL
[打印本頁]
作者:
bestlong
時間:
2007-12-14 10:25
標題:
如何在程式中註冊 OCX/ActiveX/DLL
一般處理註冊 OCX/ActiveX/DLL 的方式有修改系統機碼或用 RegSvr32.exe 來手動處理
不過也可以在程式中透過呼叫 Windows API 來處理
type
TDllRegisterServer = function: HResult; stdcall;
function RegisterOCX(FileName: string): Boolean;
var
OCXHand: THandle;
RegFunc: TDllRegisterServer;
begin
OCXHand := LoadLibrary(PChar(FileName));
RegFunc := GetProcAddress(OCXHand, 'DllRegisterServer');
if @RegFunc <> nil then
Result := RegFunc = S_OK
else
Result := False;
FreeLibrary(OCXHand);
end;
function UnRegisterOCX(FileName: string): Boolean;
var
OCXHand: THandle;
RegFunc: TDllRegisterServer;
begin
OCXHand := LoadLibrary(PChar(FileName));
RegFunc := GetProcAddress(OCXHand, 'DllUnregisterServer');
if @RegFunc <> nil then
Result := RegFunc = S_OK
else
Result := False;
FreeLibrary(OCXHand);
end;
複製代碼
function RegisterServer(const aDllFileName: string; aRegister: Boolean): Boolean;
type
TRegProc = function: HResult; stdcall;
const
cRegFuncNameArr: array [Boolean] of PChar = ('DllUnregisterServer', 'DllRegisterServer');
var
vLibHandle: THandle;
vRegProc: TRegProc;
begin
Result := False;
vLibHandle := LoadLibrary(PChar(aDllFileName));
if vLibHandle = 0 then Exit;
@vRegProc := GetProcAddress(vLibHandle, cRegFuncNameArr[aRegister]);
if @vRegProc <> nil then
Result := vRegProc = S_OK;
FreeLibrary(vLibHandle);
end;
複製代碼
不過需要注意的是,當你的程式是可以重複執行的話就要注意 UnRegister 的時機,若是先關閉的程式做了 UnRegister 處理的話,尚未結束執行的程式可是會出問題的。
參考資料來源
http://www.swissdelphicenter.ch/en/showcode.php?id=1281
作者:
bestlong
時間:
2007-12-14 10:28
另外要注意的是 DllRegisterServer 與 DllUnregisterServer 兩個參數的大小寫都要正確
歡迎光臨 bestlong 怕失憶論壇 (http://www.bestlong.idv.tw/)
Powered by Discuz! X1.5