與瀏覽器加載排查全流程)
簡(jiǎn)介這份資源是??低?NetVideoActiveX 系列 OCX 控件的開(kāi)發(fā)包面向需要在 Windows 桌面程序中接入??禂z像頭、NVR 等硬件設(shè)備的軟件開(kāi)發(fā)者以及從事視頻監(jiān)控系統(tǒng)二次開(kāi)發(fā)的技術(shù)人員。它解決的正是實(shí)時(shí)視頻預(yù)覽、抓圖、錄像、云臺(tái)和鏡頭控制、雙向?qū)χv、音量調(diào)節(jié)、畫(huà)面亮度與對(duì)比度等圖像調(diào)節(jié)以及報(bào)警輸出等效果如何嵌入業(yè)務(wù)系統(tǒng)的問(wèn)題此外開(kāi)發(fā)者還可以借助隨包提供的 SDK 頭文件、接口說(shuō)明和示例工程快速完成集成。壓縮包共 56 個(gè)文件約 5.48MB主要包含 ocx 控件本體及配套 dll 運(yùn)行庫(kù)、h 頭文件、cpp 源碼、inf 驅(qū)動(dòng)信息與注冊(cè)腳本另有 exe 演示程序、doc 接口文檔和 txt 說(shuō)明這些文件足以支撐 從注冊(cè)、調(diào)用到調(diào)試的完整流程。資源頁(yè)顯示已有 4287 人學(xué)習(xí)對(duì)想摸清???OCX 調(diào)用方式與視頻流處理思路的開(kāi)發(fā)者而言是一份可直接參考的實(shí)踐材料。1. 視頻 OCX 控件裝不上的那一刻問(wèn)題多半不在安裝包瀏覽器里那塊視頻預(yù)覽區(qū)域一直是灰的右下角連個(gè)報(bào)錯(cuò)都不給按 F12 也只看到一句object加載失敗。這是很多人第一次裝視頻 OCX 控件的共同遭遇。頁(yè)面其它模塊都正常唯獨(dú)播放器區(qū)域起不來(lái)于是開(kāi)始懷疑安裝包損壞、懷疑網(wǎng)絡(luò)、懷疑服務(wù)端沒(méi)有推流來(lái)回折騰兩天最后發(fā)現(xiàn)是瀏覽器進(jìn)程位數(shù)和控件對(duì)不上。這類視頻插件在安防監(jiān)控、工業(yè)檢測(cè)、醫(yī)療影像的后臺(tái)頁(yè)面里極其常見(jiàn)實(shí)時(shí)預(yù)覽、錄像回放、抓圖、云臺(tái)控制全靠它撐著。裝不好帶來(lái)的后果是整條預(yù)覽鏈路斷掉處理起來(lái)并不只是少一個(gè)功能。下面這套流程是我在 Windows 上反復(fù)裝過(guò)之后固定下來(lái)的從環(huán)境確認(rèn)一直走到能取到第一幀畫(huà)面。2. 裝前定環(huán)境系統(tǒng)版本、瀏覽器內(nèi)核與 32/64 位必須對(duì)齊裝 OCX 控件失敗八成不是安裝包的錯(cuò)而是宿主環(huán)境沒(méi)選對(duì)。所謂宿主環(huán)境就是最終加載這個(gè)控件的那個(gè)進(jìn)程它運(yùn)行在哪個(gè)系統(tǒng)上、用的是什么內(nèi)核、是 32 位還是 64 位。這三件事只要有一件錯(cuò)位regsvr32可能報(bào)成功頁(yè)面依舊白屏排查方向會(huì)被徹底帶偏。2.1 內(nèi)核選型能跑 ActiveX 的只有 TridentOCX 本質(zhì)是 COM 組件靠object標(biāo)簽嵌進(jìn)網(wǎng)頁(yè)瀏覽器必須支持 ActiveX 才能實(shí)例化它?,F(xiàn)在主流的 Chromium 內(nèi)核Edge 默認(rèn)模式、Chrome、各種新版國(guó)產(chǎn)瀏覽器的高速模式已經(jīng)把 ActiveX 通道徹底關(guān)掉了object標(biāo)簽最終只會(huì)渲染成一個(gè)零尺寸的空盒子不報(bào)錯(cuò)也不提示這就是灰屏的直接來(lái)源。常見(jiàn)做法是先確認(rèn)目標(biāo)機(jī)器上有哪些可用的 Trident 宿主再?zèng)Q定用哪條路宿主環(huán)境渲染內(nèi)核能否加載 OCX備注IE 1132 位進(jìn)程Trident可以老項(xiàng)目里最穩(wěn)的組合IE 1164 位進(jìn)程Trident僅當(dāng)控件是 64 位32 位控件在這里必定失敗Edge 企業(yè)模式 IE 模式頁(yè)Trident可以需要配站點(diǎn)列表 XMLEdge / Chrome 普通模式Blink不可以只會(huì)得到一個(gè)空盒子雙核瀏覽器兼容模式Trident多數(shù)可以內(nèi)核切換要手動(dòng)確認(rèn)并鎖定Windows 10 默認(rèn)還帶著 IE 11路徑在C:\Program Files (x86)\Internet Explorer\iexplore.exe這個(gè)路徑下的是 32 位版本正好匹配絕大多數(shù) 32 位視頻控件。Windows 11 已經(jīng)把 IE 11 從常規(guī)入口移除只剩 Edge 的 IE 模式可用這時(shí)候就必須用企業(yè)模式站點(diǎn)列表把目標(biāo)站點(diǎn)固定進(jìn)去否則每次打開(kāi)都落回 Blink控件永遠(yuǎn)加載不了。2.2 位數(shù)對(duì)齊System32 里放的是 64 位程序64 位 Windows 上有個(gè)反直覺(jué)的細(xì)節(jié)C:\Windows\System32里放的是 64 位程序C:\Windows\SysWOW64里放的才是 32 位程序。名字看起來(lái)正好相反我第一次踩這個(gè)坑的時(shí)候?qū)χ鴥蓚€(gè)目錄愣了半天。注冊(cè) 32 位 OCX 必須用 32 位的注冊(cè)器:: 注冊(cè) 32 位控件 —— 必須顯式指定 SysWOW64 下的 regsvr32 C:\Windows\SysWOW64\regsvr32.exe C:\Program Files (x86)\VideoCtrl\VideoOCX.ocx :: 注冊(cè) 64 位控件才用 System32 下的注冊(cè)器 C:\Windows\System32\regsvr32.exe C:\Program Files\VideoCtrl\VideoOCX64.ocx前一條命令里SysWOW64\regsvr32.exe是 32 位進(jìn)程它會(huì)把注冊(cè)信息寫(xiě)進(jìn)HKCR\CLSID的 32 位視圖后一條用的是 64 位注冊(cè)器寫(xiě)入 64 位視圖。兩邊互相看不見(jiàn)這也是為什么有人明明注冊(cè)成功了換個(gè)瀏覽器版本就又不認(rèn)。同理宿主進(jìn)程也得對(duì)齊。用 32 位 IE 打開(kāi)頁(yè)面加載的是 32 位視圖里的控件如果哪天用戶從開(kāi)始菜單點(diǎn)了個(gè) 64 位的快捷方式同一個(gè)頁(yè)面立刻失效。穩(wěn)妥的做法是在部署文檔里把快捷方式固定成 32 位 IE 的完整路徑別讓用戶自己找。2.3 解壓后先看什么四個(gè)文件決定后面所有事拿到控件包之后別急著雙擊setup.exe先解壓看一眼目錄結(jié)構(gòu)。視頻類 OCX 包通常長(zhǎng)這樣文件/目錄作用判斷要點(diǎn)VideoOCX.ocx主控件看文件大小是否正常太小說(shuō)明下載截?cái)?.dll依賴庫(kù)解碼、網(wǎng)絡(luò)、加密數(shù)量不固定少一個(gè)就報(bào) 0x8007007E*.cab網(wǎng)頁(yè)自動(dòng)分發(fā)包只在走瀏覽器自動(dòng)安裝時(shí)需要*.inf注冊(cè)與安裝信息里面有 CLSID后面驗(yàn)證要用*.cat/ 數(shù)字簽名簽名證書(shū)無(wú)簽名控件會(huì)被 IE 直接攔截?cái)?shù)字簽名這一項(xiàng)最容易被忽略。右鍵VideoOCX.ocx→ 屬性 → 數(shù)字簽名如果標(biāo)簽頁(yè)是空的或者簽名狀態(tài)顯示異常IE 的默認(rèn)安全策略會(huì)拒絕實(shí)例化頁(yè)面表現(xiàn)同樣是加載不出來(lái)但它和位數(shù)問(wèn)題完全是兩碼事排查方向要提前分開(kāi)。提示控件目錄不要放在桌面、下載目錄或任何含中文、含空格的路徑下。UAC 的文件虛擬化會(huì)把這些位置的寫(xiě)入重定向到VirtualStore注冊(cè)表里記錄的路徑和實(shí)際文件位置對(duì)不上后面卸載和升級(jí)全是坑。3. 注冊(cè) OCX 控件從落盤(pán)目錄到 regsvr32 返回碼解讀環(huán)境確認(rèn)完真正動(dòng)手的部分其實(shí)只有三步把文件放到固定目錄、用對(duì)應(yīng)位數(shù)的注冊(cè)器寫(xiě)注冊(cè)表、驗(yàn)證注冊(cè)結(jié)果。步驟不多但每一步都有明確的失敗信號(hào)學(xué)會(huì)讀這些信號(hào)比記住命令更重要。3.1 固定安裝目錄并用管理員權(quán)限落地我一般把這類控件統(tǒng)一放到C:\Program Files (x86)\VideoCtrl\所有機(jī)器保持同一個(gè)路徑。原因很實(shí)際控件內(nèi)部經(jīng)常用相對(duì)路徑去找同目錄的解碼庫(kù)和配置文件路徑一變就找不到同時(shí)統(tǒng)一的路徑讓后面寫(xiě)批量腳本、寫(xiě)卸載腳本都省事。復(fù)制文件這一步必須在提升權(quán)限的命令行里做用普通權(quán)限的資源管理器拖拽文件會(huì)落到VirtualStore里:: 以管理員身份運(yùn)行 cmd先建目錄再拷貝 mkdir C:\Program Files (x86)\VideoCtrl xcopy D:\pkg\VideoCtrl\*.* C:\Program Files (x86)\VideoCtrl\ /E /Y :: 確認(rèn)文件真的在目標(biāo)目錄而不是被重定向 dir C:\Program Files (x86)\VideoCtrl\*.ocx/E表示連子目錄一起復(fù)制/Y表示覆蓋時(shí)不詢問(wèn)。第二條dir是關(guān)鍵的自檢如果這一步列不出.ocx說(shuō)明復(fù)制根本沒(méi)落到目標(biāo)位置后面注冊(cè)一定失敗不用再往下試。目錄里如果還有*.dll依賴把它們和.ocx放在同一層是最省事的做法。Windows 加載 COM 組件時(shí)會(huì)先在組件所在目錄找依賴同目錄能解決掉大部分找不到指定模塊的問(wèn)題。3.2 regsvr32 注冊(cè)與返回碼對(duì)照注冊(cè)命令本身很短難的是看懂它吐出來(lái)的東西。:: /s 靜默模式不彈成功對(duì)話框失敗時(shí)仍會(huì)彈錯(cuò)誤框 regsvr32 /s C:\Program Files (x86)\VideoCtrl\VideoOCX.ocx :: 立刻回讀退出碼0 才是真的成功 echo %errorlevel%/s參數(shù)只是壓掉那個(gè)注冊(cè)成功的彈窗它不會(huì)改變返回值。要在腳本里判斷靠的是%errorlevel%。常見(jiàn)的幾個(gè)值對(duì)應(yīng)的問(wèn)題完全不一樣返回碼含義絕大多數(shù)情況下的真實(shí)原因0x00000000注冊(cè)成功注冊(cè)表已寫(xiě)入可以進(jìn)下一步0x80070005拒絕訪問(wèn)當(dāng)前命令行沒(méi)有管理員權(quán)限0x8007007E找不到指定模塊依賴 DLL 缺失或不在同目錄0x80004005未指定的錯(cuò)誤位數(shù)不匹配或依賴鏈斷在更深一層0x80029C4A加載類型庫(kù)失敗依賴的.tlb或類型庫(kù) DLL 沒(méi)注冊(cè)0x80070005最好處理重新用管理員身份開(kāi)一個(gè)命令行就行。0x8007007E和0x80004005才是真正花時(shí)間的前者要挨個(gè)確認(rèn)依賴庫(kù)是否齊全后者先懷疑位數(shù)。判斷位數(shù)有個(gè)笨但有效的辦法——用 32 位和 64 位兩個(gè)注冊(cè)器各試一次哪個(gè)返回 0控件就是哪個(gè)位數(shù)的。依賴缺失可以用dumpbin看導(dǎo)入表或者用where確認(rèn)系統(tǒng)里有沒(méi)有對(duì)應(yīng)的運(yùn)行庫(kù):: 查看 ocx 依賴了哪些 DLL需要 VS 的 dumpbin或裝 Windows SDK dumpbin /dependents C:\Program Files (x86)\VideoCtrl\VideoOCX.ocx :: 檢查某個(gè)依賴是否在系統(tǒng)路徑里 where msvcr120.dll視頻類控件對(duì) VC 運(yùn)行庫(kù)的依賴非常普遍msvcr120.dll、msvcp120.dll這類文件缺失會(huì)導(dǎo)致注冊(cè)階段直接失敗。補(bǔ)齊對(duì)應(yīng)版本的運(yùn)行庫(kù)之后再注冊(cè)一次往往一次就過(guò)。3.3 批量注冊(cè)與卸載給自己留一顆后悔藥機(jī)器一多手工一條條敲不現(xiàn)實(shí)更麻煩的是升級(jí)和回滾——新版本控件覆蓋舊版本之前必須先注銷舊版本否則注冊(cè)表里會(huì)留下兩套 CLSID 指向同一個(gè)文件加載時(shí)行為隨機(jī)。# 批量注冊(cè)目錄下所有 ocx并逐個(gè)打印結(jié)果 $ocxDir C:\Program Files (x86)\VideoCtrl $reg32 $env:WINDIR\SysWOW64\regsvr32.exe Get-ChildItem -Path $ocxDir -Filter *.ocx | ForEach-Object { $reg32 /s $_.FullName # 0 表示注冊(cè)成功其它值直接暴露在控制臺(tái)方便定位是哪個(gè)文件出的問(wèn)題 {0} {1} -f $_.Name, $LASTEXITCODE }這段腳本的關(guān)鍵在$LASTEXITCODE它拿到的是上一個(gè)外部進(jìn)程的退出碼正好是regsvr32的返回值。批量場(chǎng)景下最怕其中一個(gè)失敗了但沒(méi)人知道逐個(gè)打印能立刻定位到具體文件。卸載把/s后面的注冊(cè)動(dòng)作換成/u即可同樣是先管理員權(quán)限、再對(duì)應(yīng)位數(shù):: 注銷控件升級(jí)或回滾前必須先做這一步 C:\Windows\SysWOW64\regsvr32.exe /u /s C:\Program Files (x86)\VideoCtrl\VideoOCX.ocx注銷完別急著刪目錄先確認(rèn)注冊(cè)表里那條 CLSID 已經(jīng)清掉。有些控件注銷不干凈殘留項(xiàng)會(huì)讓新版本加載到舊路徑表現(xiàn)形式是升級(jí)了但功能沒(méi)變非常難查。4. 瀏覽器側(cè)配置安全區(qū)域、ActiveX 許可與文檔模式控件注冊(cè)成功只是讓系統(tǒng)認(rèn)識(shí)了這個(gè) COM 組件瀏覽器認(rèn)不認(rèn)是另一回事。IE 的安全模型對(duì)未簽名、非安全標(biāo)記的 ActiveX 控件限制很嚴(yán)默認(rèn)配置下用戶每次打開(kāi)頁(yè)面都會(huì)看到一個(gè)黃色信息欄點(diǎn)允許之后才加載——在需要長(zhǎng)期值守的監(jiān)控頁(yè)面上這個(gè)交互基本不可接受。4.1 把站點(diǎn)放進(jìn)受信任區(qū)域并放開(kāi) ActiveX 限制第一步是把頁(yè)面所在站點(diǎn)加進(jìn)受信任站點(diǎn)區(qū)域第二步是調(diào)整該區(qū)域的 ActiveX 策略。界面操作路徑是「Internet 選項(xiàng) → 安全 → 受信任的站點(diǎn) → 站點(diǎn)」但要批量部署時(shí)更省事的是直接寫(xiě)注冊(cè)表:: 把內(nèi)網(wǎng)站點(diǎn)加入受信任區(qū)域2 表示受信任站點(diǎn)區(qū)域 reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\192.168.1.20 /v * /t REG_DWORD /d 2 /f :: 受信任區(qū)域內(nèi)的 ActiveX 策略1200運(yùn)行控件1201運(yùn)行未標(biāo)記安全的控件 reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2 /v 1200 /t REG_DWORD /d 0 /f reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2 /v 1201 /t REG_DWORD /d 0 /f :: 關(guān)閉該區(qū)域的信息欄提示避免每次都要手動(dòng)點(diǎn)允許 reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2 /v 2201 /t REG_DWORD /d 0 /fZoneMap\Domains下面那一條/v *表示對(duì)這個(gè)域名下的所有協(xié)議生效/d 2是區(qū)域編號(hào)受信任站點(diǎn)就是 2。區(qū)域編號(hào)寫(xiě)錯(cuò)是常見(jiàn)低級(jí)錯(cuò)誤——寫(xiě)成 1 會(huì)落到本地 Intranet策略雖然接近但不完全一樣出問(wèn)題時(shí)很難想到是這里。Zones\2里的三個(gè)值分別對(duì)應(yīng)三件事1200控制是否允許運(yùn)行 ActiveX 控件和插件1201控制是否允許運(yùn)行沒(méi)有標(biāo)記為安全的控件2201控制是否彈出信息欄。三個(gè)都設(shè)成0啟用/關(guān)閉提示之后頁(yè)面才能做到打開(kāi)即加載。注意這幾條寫(xiě)在HKCU下只對(duì)當(dāng)前用戶生效。做整機(jī)部署時(shí)要確認(rèn)執(zhí)行命令的賬號(hào)就是最終使用頁(yè)面的賬號(hào)否則改了半天換個(gè)登錄用戶又回到原點(diǎn)。4.2 文檔模式與兼容性視圖別讓頁(yè)面掉進(jìn) IE7 模式控件能加載了還有一種情況會(huì)讓它加載失敗頁(yè)面被 IE 用低版本文檔模式渲染。老后臺(tái)頁(yè)面經(jīng)常帶一個(gè)X-UA-Compatible的 meta寫(xiě)著IE7或IE8在這個(gè)文檔模式下object標(biāo)簽的實(shí)例化行為和新版差別很大控件可能加載成功但接口全為空。頁(yè)面?zhèn)燃右恍新暶魇浅杀咀畹偷男薹?-- 放在 head 最前面強(qiáng)制用本機(jī)最高版本文檔模式渲染 -- meta http-equivX-UA-Compatible contentIEedge /如果頁(yè)面源碼改不動(dòng)就在瀏覽器側(cè)加兼容性視圖設(shè)置或者用 F12 開(kāi)發(fā)者工具的「文檔模式」下拉框手動(dòng)切到 Edge 模式驗(yàn)證一次。很多時(shí)候頁(yè)面在 Edge 文檔模式下完全正常那就說(shuō)明問(wèn)題確實(shí)出在 meta 聲明上改源碼才是根治。驗(yàn)證方法很直接F12 打開(kāi)控制臺(tái)輸入document.documentMode返回 11 說(shuō)明是標(biāo)準(zhǔn)模式返回 7 或 8 就是掉進(jìn)了兼容模式。這個(gè)值記下來(lái)后面排查任何控件加載了但不干活的問(wèn)題都用得上。4.3 端口、協(xié)議與混合內(nèi)容控件之外的三個(gè)前提控件只負(fù)責(zé)解碼和渲染視頻流本身要靠網(wǎng)絡(luò)拉。頁(yè)面能加載控件、控件也能實(shí)例化但預(yù)覽區(qū)一片黑問(wèn)題多半在端口和協(xié)議上。視頻類控件通常需要直連設(shè)備或流媒體服務(wù)的 HTTP、RTSP 端口內(nèi)網(wǎng)防火墻一擋控件這邊什么錯(cuò)誤信息都不會(huì)給。部署前把這三件事確認(rèn)掉目標(biāo)設(shè)備的服務(wù)端口是否可達(dá)、頁(yè)面用的協(xié)議和控件請(qǐng)求的協(xié)議是否一致、頁(yè)面域名和接口地址是否同源。# 測(cè)試設(shè)備或流媒體服務(wù)的端口是否可達(dá) Test-NetConnection -ComputerName 192.168.1.20 -Port 8000 # 一次測(cè)多個(gè)常用端口省得來(lái)回改 554, 8000, 8080 | ForEach-Object { $r Test-NetConnection -ComputerName 192.168.1.20 -Port $_ -InformationLevel Quiet {0} {1} -f $_, $r }-InformationLevel Quiet讓命令只返回布爾值適合在循環(huán)里批量判斷。返回True表示 TCP 握手成功False就要去查防火墻規(guī)則或服務(wù)是否啟動(dòng)。協(xié)議這一項(xiàng)也常翻車頁(yè)面走 HTTPS控件內(nèi)部卻去請(qǐng)求 HTTP 的取流接口IE 會(huì)按混合內(nèi)容策略直接攔掉控制臺(tái)里只留一條語(yǔ)義模糊的安全警告。要么把取流服務(wù)也上 HTTPS要么讓頁(yè)面整體走 HTTP別一半一半。5. 排查記錄五個(gè)注冊(cè)成功但就是不出畫(huà)面的現(xiàn)場(chǎng)前面幾步走完正常情況下頁(yè)面應(yīng)該能看到畫(huà)面了。但現(xiàn)場(chǎng)環(huán)境千奇百怪我把自己遇到過(guò)、并且?guī)蛣e人遠(yuǎn)程看過(guò)的問(wèn)題整理成五條每條都按現(xiàn)象、原因、解決的順序?qū)憣?duì)照著查比漫無(wú)目的地試要快得多。5.1 安裝與注冊(cè)階段的兩個(gè)高頻失敗現(xiàn)象一regsvr32彈出模塊已加載但找不到入口點(diǎn) DllRegisterServer。原因注冊(cè)器位數(shù)和控件位數(shù)不匹配。用 64 位System32\regsvr32.exe去注冊(cè)一個(gè) 32 位 OCX 時(shí)加載器能讀到文件頭但按 64 位格式解析導(dǎo)出表就找不到入口。解決換成C:\Windows\SysWOW64\regsvr32.exe重新注冊(cè)。如果反過(guò)來(lái)——控件確實(shí)是 64 位——就用System32的那個(gè)。判斷方法是兩個(gè)都試一遍哪個(gè)返回 0 就是哪個(gè)。現(xiàn)象二注冊(cè)返回0x8007007E提示找不到指定模塊。原因主控件的依賴 DLL 缺失。視頻控件普遍依賴解碼庫(kù)、網(wǎng)絡(luò)庫(kù)、VC 運(yùn)行庫(kù)缺任何一個(gè)都會(huì)在這里斷掉。注意這個(gè)錯(cuò)誤里的模塊指的不是.ocx本身而是它依賴的東西。解決先用dumpbin /dependents列出導(dǎo)入表逐個(gè)where確認(rèn)是否在系統(tǒng)路徑里不在的從安裝包里找出來(lái)放到.ocx同目錄。如果安裝包里根本沒(méi)有那就是 VC 運(yùn)行庫(kù)沒(méi)裝補(bǔ)對(duì)應(yīng)版本再注冊(cè)。5.2 加載與播放階段的三個(gè)隱性故障現(xiàn)象三注冊(cè)成功、頁(yè)面也不報(bào)錯(cuò)但預(yù)覽區(qū)域一直是空白F12 里能看到object元素存在。原因?yàn)g覽器進(jìn)程位數(shù)不對(duì)。用戶從開(kāi)始菜單打開(kāi)的可能是 64 位 IE或者用了某個(gè)默認(rèn)走 64 位內(nèi)核的雙核瀏覽器控件注冊(cè)在 32 位視圖里64 位進(jìn)程根本找不到。解決直接用C:\Program Files (x86)\Internet Explorer\iexplore.exe的完整路徑啟動(dòng)或者把快捷方式改成這個(gè)路徑。判斷當(dāng)前進(jìn)程位數(shù)可以在任務(wù)管理器里看32 位進(jìn)程后面會(huì)帶(32 位)標(biāo)記。現(xiàn)象四控件加載了接口也能調(diào)用但畫(huà)面始終是黑的日志里沒(méi)有任何錯(cuò)誤。原因取流端口不通或者服務(wù)端沒(méi)有真正推流??丶谶@種情況下拿不到數(shù)據(jù)只能一直等表現(xiàn)就是黑屏而不是報(bào)錯(cuò)。解決先用Test-NetConnection測(cè)端口再用廠商提供的獨(dú)立客戶端連同一臺(tái)設(shè)備驗(yàn)證。如果客戶端能出畫(huà)面、網(wǎng)頁(yè)不行問(wèn)題就在網(wǎng)頁(yè)側(cè)的協(xié)議或鑒權(quán)兩邊都不行問(wèn)題在設(shè)備或網(wǎng)絡(luò)。現(xiàn)象五昨天還好好的重啟之后每次打開(kāi)頁(yè)面都彈此網(wǎng)站想要運(yùn)行以下加載項(xiàng)點(diǎn)了允許才出畫(huà)面。原因站點(diǎn)沒(méi)進(jìn)受信任區(qū)域或者進(jìn)了但 ActiveX 策略被組策略刷回去了。企業(yè)環(huán)境里域策略優(yōu)先級(jí)高于本地注冊(cè)表手工改的HKCU會(huì)被覆蓋。解決先用reg query確認(rèn)Zones\2下的1200、1201是否還是 0如果被改回去了說(shuō)明有域策略在下發(fā)得從策略層面加例外本地怎么改都留不住。6. 裝完怎么驗(yàn)證三條自檢命令加一個(gè)最小測(cè)試頁(yè)裝完不驗(yàn)證等于沒(méi)裝。我的習(xí)慣是固定走一遍三條自檢全部通過(guò)再去開(kāi)業(yè)務(wù)頁(yè)面這樣一旦出問(wèn)題能立刻分清是控件的事還是頁(yè)面的事。第一條查注冊(cè)表確認(rèn) CLSID 真的寫(xiě)進(jìn)去了:: 按控件名反查注冊(cè)信息能看到 CLSID 才算注冊(cè)到位 reg query HKCR\VideoOCX.Control.1 /s 2nul | findstr /i CLSID第二條查依賴完整性把.ocx所在目錄的 DLL 數(shù)量和安裝包里的對(duì)一遍少一個(gè)都別往下走。第三條查端口連通性用前面那條Test-NetConnection把設(shè)備的服務(wù)端口測(cè)通。三條都過(guò)了就用一個(gè)最小頁(yè)面做端到端驗(yàn)證繞開(kāi)業(yè)務(wù)代碼里的所有干擾!-- 最小驗(yàn)證頁(yè)classid 換成 inf 文件或注冊(cè)表里查到的真實(shí)值 -- object idocx classidclsid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX width640 height360/object script var el document.getElementById(ocx); // 能拿到對(duì)象說(shuō)明實(shí)例化成功拿到 null 說(shuō)明控件根本沒(méi)被創(chuàng)建 document.title el ? OBJECT_OK : OBJECT_MISSING; /script看瀏覽器標(biāo)題欄就知道結(jié)果顯示OBJECT_OK說(shuō)明控件已經(jīng)實(shí)例化接下來(lái)才是接口調(diào)用和取流顯示OBJECT_MISSING說(shuō)明還卡在加載層回頭查位數(shù)、區(qū)域和簽名頁(yè)面直接報(bào)腳本錯(cuò)誤多半是 CLSID 抄錯(cuò)了。驗(yàn)證項(xiàng)命令/動(dòng)作期望結(jié)果注冊(cè)表reg query HKCR\VideoOCX.Control.1能列出 CLSID 子鍵依賴對(duì)比目錄內(nèi) DLL 與安裝包數(shù)量一致無(wú)缺失網(wǎng)絡(luò)Test-NetConnection測(cè)服務(wù)端口返回 True實(shí)例化打開(kāi)最小測(cè)試頁(yè)標(biāo)題顯示 OBJECT_OK端到端打開(kāi)業(yè)務(wù)頁(yè)面并預(yù)覽出畫(huà)面可抓圖這張表我一般會(huì)直接貼進(jìn)部署記錄里誰(shuí)裝的、哪臺(tái)機(jī)器、五項(xiàng)分別什么結(jié)果一目了然。后來(lái)?yè)Q人接手或者半年后回滾翻記錄比重裝一遍快得多。從那以后我每次部署這類視頻控件都強(qiáng)制先把最小測(cè)試頁(yè)跑通再碰業(yè)務(wù)頁(yè)面——業(yè)務(wù)代碼里干擾因素太多一個(gè)空白預(yù)覽區(qū)背后可能同時(shí)壓著位數(shù)、區(qū)域、端口三個(gè)問(wèn)題只有把變量一個(gè)個(gè)摘掉才知道到底是哪一環(huán)在攔。希望這套流程能幫你少走幾個(gè)晚上。本文還有配套的精品資源點(diǎn)擊獲取