【茶包射手日記】四探RSClientPrint無法列印問題

接獲報案,有個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)錯誤,依網友經驗重開機即可排除。

歡迎推文分享:
Published 12 April 2013 12:21 PM 由 Jeffrey
Views: 13,137



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<April 2013>
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication