接獲報案,有個ReportViewer開啟ReportServer RDL報表的網頁,在做完Windows Update後,無法使用網頁的列印鈕直接列印報表,會彈出"無法載入用戶端列印控制項"訊息。

很好! 算算已是第四次跟RSClientPrint茶包交鋒了。(1 2 3)

操作IE重現無法列印問題並側錄HTTP封包,有以下發現:

  1. 由Reserved.ReportViewerWebControl.axd?OpType=Resource&Version=8.0.50727.1843&Name=Scripts.ReportViewer.js連結取得版號8.0.50727.1843,經查屬於Microsoft Report Viewer Redistributable 2005 Service Pack 1
  2. 按下列印鈕後,傳回的Reserved.ReportViewerWebControl.axd?ReportSession=u5...略...&ReportStack=1&OpType=PrintHtml網頁有以下AcitveX物件宣告:
    <OBJECT ID="RSClientPrint" CLASSID="CLSID:41861299-EAB2-4DCC-986C-802AE12AC499"
    CODEBASE="/ReportApp/Reserved.ReportViewerWebControl.axd?ReportSession=u5...略...&amp;ReportStack=1&amp;OpType=PrintCab#Version=2005,090,5000,00" VIEWASTEXT>
    </OBJECT>
  3. 依CODEBASE路徑下載CAB檔解開,在RSClientPrint.inf看到以下訊息:
    [RSClientPrint.dll]
        file-win32-x86=thiscab
        clsid={0D221D00-A6ED-477C-8A91-41F3B660A832}
        FileVersion=2005,90,5000,00
        RegisterServer=yes

很快就發現矛盾點:

網頁<OBJECT>的CLSID為41861299-EAB2-4DCC-986C-802AE12AC499、而CAB中提供的RSClientPrint.dll CLSID卻是0D221D00-A6ED-477C-8A91-41F3B660A832。換句話說,就算下載CAB裝好RSClientPrint,也會因其CLSID跟<OBJECT>不一致,<OBJECT>還是不會載入RSClientPrint,推測這就是"無法載入用戶端列印控制項"的原因。

使用這兩個CLSID爬文,很快鎖定目標,在微軟ReportViewer RD的這篇文章提到,修正GDI+問題後,RSClientPrint更換了CLSID:

Originally shipped CLSID = {FA91DF8D-53AB-455D-AB20-F2F023E498D3}
CLSID after previous update ={41861299-EAB2-4DCC-986C-802AE12AC499}
New CLSID = {0D221D00-A6ED-477C-8A91-41F3B660A832}

對照本案例,推論ReportViewer未更新至最新版,故<OBJECT>中使用原CLSID,而CAB檔則已被更新,故為新CLSID。進一步詢問,問題主機的SQL Server、ReportServer、Web Server(ReportViewer)都裝在同一台,前些時候安裝過Report Viewer Redistributable 2005 Service Pack 1、SQL 2005 SP4。

Bingo!! GDI+修正是在Report Viewer Redistributable 2005 Service Pack 1 GDIPLUS.DLL Security Update所加入的,更新後版本為8.0.50727.4401,而先前觀察到的是8.0.50727.1843是SP1,在GDI+更正之前,故採用舊版CLSID;而CAB檔應是安裝SQL 2005 SP4後被換成新版新的CLSID,此一差異引發錯誤。

安裝Report Viewer Redistributable 2005 Service Pack 1 GDIPLUS.DLL Security Update後,無法列印問題消失,Case Closed!

PS: 若更新完出現Error  loading resource library (0x8007007E)錯誤,依網友經驗重開機即可排除。


Comments

Be the first to post a comment

Post a comment


47 + 28 =