bestlong 怕失憶論壇

標題: 如何在程式中註冊 OCX/ActiveX/DLL [打印本頁]

作者: bestlong    時間: 2007-12-14 10:25     標題: 如何在程式中註冊 OCX/ActiveX/DLL

一般處理註冊 OCX/ActiveX/DLL 的方式有修改系統機碼或用 RegSvr32.exe 來手動處理
不過也可以在程式中透過呼叫 Windows API 來處理

  1. type
  2.   TDllRegisterServer = function: HResult; stdcall;

  3. function RegisterOCX(FileName: string): Boolean;
  4. var
  5.   OCXHand: THandle;
  6.   RegFunc: TDllRegisterServer;
  7. begin
  8.   OCXHand := LoadLibrary(PChar(FileName));
  9.   RegFunc := GetProcAddress(OCXHand, 'DllRegisterServer');
  10.   if @RegFunc <> nil then
  11.     Result := RegFunc = S_OK
  12.   else
  13.     Result := False;
  14.   FreeLibrary(OCXHand);
  15. end;

  16. function UnRegisterOCX(FileName: string): Boolean;
  17. var
  18.   OCXHand: THandle;
  19.   RegFunc: TDllRegisterServer;
  20. begin
  21.   OCXHand := LoadLibrary(PChar(FileName));
  22.   RegFunc := GetProcAddress(OCXHand, 'DllUnregisterServer');
  23.   if @RegFunc <> nil then
  24.     Result := RegFunc = S_OK
  25.   else
  26.     Result := False;
  27.   FreeLibrary(OCXHand);
  28. end;
複製代碼

  1. function RegisterServer(const aDllFileName: string; aRegister: Boolean): Boolean;
  2. type
  3.   TRegProc = function: HResult; stdcall;
  4. const
  5.   cRegFuncNameArr: array [Boolean] of PChar = ('DllUnregisterServer', 'DllRegisterServer');
  6. var
  7.   vLibHandle: THandle;
  8.   vRegProc: TRegProc;
  9. begin
  10.   Result := False;
  11.   vLibHandle := LoadLibrary(PChar(aDllFileName));
  12.   if vLibHandle = 0 then Exit;
  13.     @vRegProc := GetProcAddress(vLibHandle, cRegFuncNameArr[aRegister]);
  14.   if @vRegProc <> nil then
  15.     Result := vRegProc = S_OK;
  16.   FreeLibrary(vLibHandle);
  17. 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