Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
有關 OCX 的安裝, 除了 DChat 討論資料庫中既有的討論之外, 下午發現了一個新的安裝方式, 謹提出來與大家討論(尚有一事未明).
當 OCX 要隨軟體移交給用戶時, 發現的方法是...
![]() |
1. 再次閱讀版權聲明文件, 確定您了解著作權限與可以散播的檔案. |
![]() |
2. 確定有哪些 .OCX .DLL(有些 OCX 是需要額外的 DLL 的), 將這些檔案複製到用戶端的機器中, Window95通常是 C:\WINDOWS\SYSTEM |
![]() |
3. 寫一支程式呼叫信末附的 InstallOcx() 函數進行安裝. |
[原理說明]
OCX 也是 DLL(比較特殊的 DLL), 我們可以用 LoadLibrary() 載入之後, 分別查出 DllregisterServer, DllUnregisterServer, 呼叫這兩支 export function 登錄/取消 OCX.
[參考資料]
Delphi 2 Developer's Guide Second Edition. Xavier Pacheco & Steve Teixeira, Page. 195-197
請教各位測試的結果! :)
// ------------------------------------------------------------ // OCX 登錄安裝 // ------------ // 使用說明: // InstallOcx(Ocx 的檔案名稱, True(登錄)/False(取消登錄) // 傳回值: True ==> 成功 False ==> 無法登錄/取消登錄 // // e.g. // if InstallOcx('d:\windows\system\html.ocx', False) then .. // if InstallOcx('d:\windows\system\html.ocx', True) then ... // // 注意事項: // 1. 在 Delphi IDE 執行 InstallOcx('xxx.ocx', False); 解除安 // 裝後, 雖然 Windows Register Database 已清除該 OCX 的登 // 錄資料, Delphi 仍需重新啟動才有反應. // 2. 本函數使用前, uses 述句中不要忘了 uses OleCtl, OleAuto; // ------------------------------------------------------------ function InstallOcx( const sFileName: AnsiString; bSetup: boolean): boolean; var hOcx: THandle; funcRegister: TDllRegisterServer; funcUnRegister: TDllUnRegisterServer; begin Result := False; // 檢查檔案是否存在 if not FileExists(sFileName) then Raise EOleError.CreateFmt('找不到 %s', [sFileName]); // 載入 OCX (也是一個 DLL) hOcx := LoadLibrary(pchar(sFileName)); if hOcx < 32 then Raise EOleError.CreateFmt('無法載入 %s', [sFileName]); try // 查出 DllRegisterServer 的 Call address if bSetup then begin funcRegister := GetProcAddress(hOcx, 'DllRegisterServer'); if @funcRegister = nil then Raise EOleError.CreateFmt('無法載入 %s 中的 DllRegisterServer', [sFileName]); // 執行 DllRegisterServer, 並與正常值比較 Result := funcRegister = S_OK; end else begin funcUnRegister := GetProcAddress(hOcx, 'DllUnregisterServer'); if @funcUnRegister = nil then Raise EOleError.CreateFmt('無法載入 %s 中的 DllUnregisterServer', [sFileName]); // 執行, 並與正常值比較 Result := funcUnRegister = S_OK; end; // 如果執行失敗, 提示訊息. if not Result then begin if bSetup then Raise EOleError.CreateFmt('無法登錄註冊 %s', [sFileName]) else Raise EOleError.CreateFmt('無法取消註冊 %s', [sFileName]); end; finally FreeLibrary(hOcx); end; end;
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |