C++Builder 對 ActiveX 支援極佳,透過 Component → Import ActiveX Control 即可將系統已註冊的 OCX 轉為 VCL 元件。本文以 RealPlayer ActiveX 與 Shockwave Flash 為例,完整示範匯入、屬性/方法探索、播放器製作、動態載入與部署註冊技巧。
RealPlayer ActiveX Control Library、Shockwave Flash)TRealPlayer、TShockwaveFlash)若列表無目標:點 Add 瀏覽 .ocx,Builder 自動呼叫 regsvr32 註冊並產生 _TLB.h 包裝標頭。
_TLB.h(位於 Imports 目錄)InputBox 輸入參數即時驗證RealPlayer1->Controls = "ImageWindow,ControlPanel,StatusBar"; // 顯示視窗、控制列、狀態列
RealPlayer1->Align = alClient; // 填滿表單
void __fastcall TForm1::btnOpenClick(TObject*) {
OpenDialog1->Filter = "媒體檔|*.rm;*.ram;*.ra;*.mp3|所有檔|*.*";
if (OpenDialog1->Execute()) {
RealPlayer1->Source = OpenDialog1->FileName;
RealPlayer1->DoPlay(); // 啟動播放
}
}
void __fastcall TForm1::btnStopClick(TObject*) {
RealPlayer1->DoStop();
}
DoPlay() 為非同步啟動,直接 for 迴圈會瞬間發送多次播放指令。解法:
OnEndOfStream 事件,在事件處理器中遞迴呼叫 DoPlay()TTimer 輪詢 PlayState 狀態| 屬性 | 型別 | 說明 |
|---|---|---|
| Movie | WideString | .swf 檔案路徑或 URL,設空字串可卸載 |
| Loop | bool | 是否循環 |
| Quality / Quality2 | int / WideString | 1=High、2=Best、0=Low |
| ScaleMode / Scale | int / WideString | 0=ShowAll、1=NoBorder、2=ExactFit、3=原始大小 |
| AlignMode / SAlign | int / WideString | 0~15 九宮格對齊(L/T/R/B/LR/LT/.../LTRB) |
| BackgroundColor / BGColor | int / WideString | 背景色,HEX 字串如 #FFFFFF |
| Menu | bool | 右鍵選單,建議 true 讓使用者可縮放、品質切換 |
void __fastcall TForm1::Timer1Timer(TObject*) {
ProgressBar1->Position = ShockwaveFlash1->PercentLoaded(); // 0~100
if (ProgressBar1->Position == 100) Timer1->Enabled = false;
}
ShockwaveFlash1->LoadMovie(0, AnsiToOLESTR("https://example.com/anim.swf")); // Layer 0
ShellExecute 呼叫 regsvr32ShellExecute(Handle, _T("open"), _T("regsvr32.exe"), _T("/s swflash.ocx"), NULL, SW_HIDE); // 註冊
ShellExecute(Handle, _T("open"), _T("regsvr32.exe"), _T("/u /s swflash.ocx"), NULL, SW_HIDE); // 反註冊
bool RegisterOCX(const AnsiString& path, bool unreg) {
HINSTANCE h = LoadLibrary(path.c_str());
if (!h) return false;
FARPROC p = GetProcAddress(h, unreg ? "DllUnregisterServer" : "DllRegisterServer");
if (!p) { FreeLibrary(h); return false; }
HRESULT hr = ((HRESULT(__stdcall*)())p)();
FreeLibrary(h);
return SUCCEEDED(hr);
}
隨安裝包附帶 .ocx,首次執行時自動檢查並註冊(需管理員權限)。
| 現象 | 原因 | 解決 |
|---|---|---|
| 元件面板無 ActiveX 頁面 | 未安裝 ActiveX 匯入精靈 | Builder 安裝時勾選 ActiveX 支援 |
| Import 列表找不到控制項 | OCX 未在系統註冊 | Add 瀏覽 OCX 檔案,Builder 自動註冊 |
| RealPlayer 無畫面只有聲音 | Controls 屬性缺少 ImageWindow | 設定 Controls = "ImageWindow,ControlPanel,StatusBar" |
| Flash 右鍵選單被禁用 | Menu = false | 設為 true 或自訂選單 |
| 部署後類別未註冊錯誤 | 目標機缺少 OCX 或未註冊 | 隨程式附帶 OCX + 啟動自動註冊 |