發表文章

Windows AIK 套件基礎應用

圖片
文:吳俊毅 撰文日期:2009/3/24 這已經不是新的主題了,或許這樣的安裝程式的內容有些冷門,以前有人問筆者此套件究竟應該歸類為安裝佈署程式還是純粹備份資料的套件?所以我想許多人對於Windows AIK的定義還不是非常清楚,微軟對於此套件也沒有大肆宣傳,導致許多人面對新環境的安裝佈署需求時除了想到Installer或ClickOnce之外也不知道還有Windows AIK了,筆者第一次接觸Windows AKI是在2006年第二季的一個Windows Vista的TechNet的研討會,所謂的Windows AIK是Windows Automated Installation Kit的簡稱,它是Microsoft Solution Accelerator for Business Desktop Deployment 的其中一個功能,它是一個Microsoft提出針對Windows與Office有效率的規劃,部署,建置的一個完整方案,有人直接簡稱BDD,而佈署的客戶端必須安裝一個加速器,這個加速器稱做Microsoft Business Desktop Deployment Accelerator,安裝完成之後,內含一些腳本與一些程式檔。 由於BDD這套解決方案主要目的就是為了幫助企業在佈署客戶端電腦時所遭遇到的一些存在已久的問題,同時又能夠提高企業佈署用戶端電腦的效率,簡單的說,如果你要為您的企業提升佈署大量用戶端時您可以使用BDD,當然對單機來說BDD可能就沒什麼實際的意義了。 關於筆者的操作環境: 筆者的Server端環境直接安裝Microsoft Windows AIK,用戶端的BDD有2.5與3.0版,差別在於2.5是安裝在Windows XP的,3.0則是用在Windows Vista,所以筆者會使用一個Windows XP的VM環境來模擬,Windows AIK套件可以在 http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&FamilyID=94bb6e34-d890-4932-81a5-5b50c657de08 的網址下載 BDD 2.5與BDD 3.0可在這個網址下載: http:/...

如何手動或程式化產生XPS文件

圖片
文:吳俊毅 時間:2009/1/18 何謂XPS文件 XPS為(XML Parse Specification)的簡稱,我們知道XML已經是開放式資料交換的標準,於是以XML為基礎要提供一個更穩固的,開放的可信賴的電子文件交換格式應運而生,就是XPS,它可以經由硬體或是軟體來閱讀並提供更佳的列印品質,並可加入簽章容易用於機密文件的封存,微軟在Office 2007也已經完整加入此功能,Word 2007的docx其實就是XML Parse Specification文件格式。在.NET Framework 3.0中提供完整的API讓您能輕易的發佈或是匯入XPS文件,或是與WPF應用程式的整合等,今天筆者將完整介紹XPS,產生XPS方式,如何使用.NET Framework 3.o的API來產生XPS格式文件,廢話不多說,我們開始吧! XPS文件的結構 所謂的XPS文件其實是一個ZIP檔案,若讀者將其附檔名改成.zip使用Winzip或是一些支援ZIP的檢視器即可看見期內容,當然Windows XP/Vista的檔案總管本身即也支援ZIP解壓縮。 雖然我們通常並不會直接去編輯XPS文件的壓縮內容,但了解其內部包裝的內容對於我們快速的了解XPS是有幫助的,一個XPS文件的內容如下: XPS的物件階層 XPS文件定義在.NET Framework 3.0定義在XpsDocument類別中,該類別則定義在System.Windows.Xps.Package;的命名空間中,XpsDocument為一個完整XPS檔案組成,它定義了XPS整個的邏輯結構,由於一個XpsDocument是允許包含多個文件,這些文件則由FixedDocumentSequence來描述其順序關係,所以通常一個XpsDocument下會包含一個FixedDocumentSequence物件,FixedDocumentSequence下面會有FixedDocument物件來包裝FixedPage物件,整個XpsDocument結構如下圖: 產生XPS文件的幾種方式 1. 使用Microsoft XPS Document Writer印表機 2. 使用.NET Framrwork 3.0的System.Windows.Xps.Package命名空間提供的類別來產生 要產生XPS文件最快的方式當然是使用Micr...

WPF 與XBAP應用程式(2) 之 如何佈署XBAP應用程式

圖片
文:吳俊毅 時間:2009/1/8 接續第一篇WPF 與XBAP應用程式,我們已經可以正常的在Visual Studio 2008中正常的執行WpfBrowserBrushTest這個專案,但是這樣還沒完,我們必須將它佈署至IIS上頭,這樣才能夠使一般的使用者使用一般網站一樣的在IE中開啟這個網頁。 首先切換到專案的屬性畫面,並點選發行,表示我們將使用ClickOnce方式佈署,注意:這個動作需要以管理員身分來執行Visual Studio 2008,畫面如下:   請點選發行精靈按鈕,並如上圖的步驟建立一個名稱為WpfBrushTest的Web應用程式。若不是以管理員身分執行Visual Studio 2008,”本機IIS”按鈕是無法點出如圖中以結點方式顯示的本機的Web伺服器的畫面。   由於目前ClickOnce以內建在Visual Studio 2005/2008的專案屬性視窗內,ClickOnce為微軟推出,一套簡化許多安裝程序的一套安裝程式的Framework,有興趣的讀者可以參考筆者另一篇ClickOnce的文章!我們先走完我們的流程吧。 上面的動作很迅速的在IIS裡幫我們建立出一個應用程式,由於筆者使用Vista,Vista內建的是IIS 7的版本,如果讀者使用的Windows 2003或Windows XP等畫面可能會有些不太一樣,如下,筆者打開IIS 7看見並可點開WpfBrushTest站台   接著請讀者切換到內容檢視畫面,IIS 6或IIS 5.5不需要做此動作,然後在WfpBrowserBrushText.xbap按滑鼠右鍵點選瀏覽,表示直接執行這個應用程式,這時候IE上頭會顯示 未受與信任,如下: 如果點選開啟錯誤按鈕可以看見如下的詳細錯誤: 錯誤詳細資料 執行此作業時,偵測到下列錯誤。 * [2009/1/10 下午 11:05:15] System.Deployment.Application.TrustNotGrantedException (未知的子類型) - 使用者拒絕將執行所需的權限授與此應用程式。 - 來源: System.Deployment - 堆疊追蹤: 於 System.Deployment.Application.Applica...

Manifest與Vista下的安全性設定

圖片
撰文:吳俊毅 時間:2009/1/3 本篇文章使用Visual Studio 2008 Team System 本文主要探討關於Vista新增的UAC安全性設定,以及如何使用manifest設定檔案使程式具備管理者權限,這個部分牽涉範圍很廣,首先什麼叫做UAC呢,UAC是(User Access Control)的簡稱,意思是”使用者帳戶控制”,在Vista下預設也使用須具備管理者權限才可以執行的相關操作都會跳出一個如下確認的小視窗: 若點選繼續,程式才會繼續執行,否則取消程式的執行,這通常是在Vista下已預設一些動作是需要管理者權限才可以進行的一些動作,即使您已經是以Administrator權限登入,在執行系統管理工具,修改Windows或是Program Files下的檔案,或修改登錄檔,啟動與停止系統服務等等,都會跳出如上的確認對話框,即使您只是要執行諸如mmc.exe或regedit.exe等相關程式也是一樣。 也就是說在Vista下面沒有一個應用程式是具備管理者權限執行的,即使是Windows的殼層,就是俗稱的Shell,也就是Explorer.exe也不具備管理者權限,這樣許多使用者會覺得過於繁瑣,不過筆者倒是認為這是一種極佳的保護機制,如果由一個依附在Explorer.exe執行的病毒一樣會繼承Explorer的權限,甚至只是一個Process當中的Thread要進行一些需授權的動作,均會跳出這個視窗,如果使用者認為現在並未執行這個動作可按下取消便限制病毒不當的一些作業。 OK!太多的UAC細節我想另闢章結來討論好了,本文的重點是,既然Vista下執行的應用程式預設都不具備管理者權限,那如果我們開發的.NET應用程式有些動作是必須以管理者權限執行的,而在User端執行總不能說要User你用滑鼠右鍵自己點選管理者權限執行該程式,或是關閉UAC!那更不妥當,怎麼辦呢,我們的應用程式就是需要以管理者權限執行阿。沒關係,有辦法,讀者在執行一些應用程式時應該有看過這一類的確認視窗: 這個對話框表示這個應用程式需要您的授權成為管理者權限來執行,但如何做呢?在Vista下可對應用程式加上一個manifest檔案告訴Vista,此程式執行須以管理者權限來執行。...

WPF 與XBAP應用程式(1)

圖片
文:吳俊毅 時間:2009/1/1 開發環境: Visual Studio 2008 Team System 今年未去迎接2009年的第一道曙光,且筆者很久沒寫作文章了,所以想說寫一些關於WPF與XBAP應用程式 所謂的XBAP為(XAML Browser Application)的簡稱,他本身即是WPF應用程式,唯一不同於Window Form的WPF應用程式的是它是以Browser為Container,但是它執行的機器必須是有安裝.NET Framework 3.0的機器才可以執行,且IE7預設即為XBAP的Container,若您使用Visual Studio 2008 開啟一個WpfBrowserApplication專案並打開Page1的CS檔案會發現他是繼承Page這個類別,如下: public partial class Page1 : Page { public Page1() { InitializeComponent(); } } 而本篇文章為了測試我們撰寫的WPF應用程式能夠順利的移植到XBAP方式在Browser中執行嗎?以下為筆者先全撰寫的一WPF的Brush測試程式,當中有TextBox, Ellipse等相關元件,主要是測試WPF中的TextBox的ImageBrush筆刷的繪圖功能,有興趣的讀者請參考筆者另一篇WPF程式設計的文章,接著來看看這個範例: 此範例程式執行結果如下: 圖中的上面是一個TextBox控制項,使用圖片作為TextBox的底色,且字體也使用圖片作為筆刷,而呈現出來的效果,現在如果要將一改以XBAP應用程式方式執行會是什麼樣的結果呢,首先新增一個WpfBrowserApplication專案,並將下面藍色部分,也就是 .. 標籤內的內容複製到WpfBrowserApplication專案的Page1.xaml的Grid 中。 接著在預覽畫面也可以看見結果,如下圖: 接著我們就直接執行程式,執行後會發生一個錯誤,如下: 讀者應該也會收到此錯誤,這是因為在Browser的Container中預設XBAP應用程式是沒有存取IO的權限的,為什麼獨立的WPF執行檔的應用程式就可以直接執行呢,因為在Vista下獨立應用程式執行預設雖沒有管理者權限,但是還是有基本的IO存取權限,而XBAP為了安全性根據預設是不被完全信任的,許多...

COM與多型的介面(使用Delphi)

圖片
//作者: 酷小毅 (酷小毅的程式試鍊場) //2002/05/03 於永和 COM與多型的介面 1.為何談介面的多型 到現在相信大家對於物件導向OOP的觀念都非常清楚了,而這裡我要在一次強調的是關於 COM 對於物件導向的支援以及觀念與傳統的物件導向有些不同,在前面筆者提過傳統 Class 的實作繼承中 SubClass 會 Reference 到 SuperClass 上所必須參考到的資訊,而這些資訊如果修改的話勢必影響的是所有的子類別,這是非常嚴重的,在近代的 OOP 觀念中強調介面與實作分開,介面與實作分開的好處這裡就不在重複,有興趣的請參考筆者的 Delphi COM/DCOM 分散式多層應用文章。我們知道 COM 的介面是可以繼承的,不過要注意的是 COM 並沒有完全的支援繼承,也就是說介面的繼承並不會繼承該介面後端的實作部分,也就是其行為模式,不過父物件 (SuperClass, 這裡也做父系的COM Object) 可以用本身的 Reference 和型別相容的 SubClass 溝通,這也就是我們今天要討論的重點。 圖(一). SuperClass可以和跟他型別相容的SubClass (CApp1, CApp2等)溝通,因為他們都是和CPAutoInterface型別相容的。   2.透過(介面)的實作繼承來達到介面多型 我們今天要探討的是延伸於COM當中的OOP的多型觀念,目前為止相信大家已經了解實作繼承如何影響及重複使用類別當中的方法及實作,這對減少重複性程式碼不僅有高度的Reuse特性也提供了更高的維護性,而多型就是由OOP的實作繼承所演伸出的一個特色,這可以說是物件導向當中最重要的觀念了,我們知道COM強調介面與實作分開,我們可以在一些SubClass繼承某個介面來達到介面的多型 (關於傳統物件導向的多型與COM的多型之差異性有興趣可參考筆者的"Delphi如何實作繼承一個介面"文章,這裡不在重複說明) ,這若應用在 IDispatch 介面所支援的 Automation 技術上即則可達到跨行程呼叫不同應用程式的目的 (這我會在下面第4個章節說明) ,但介面繼承它不像傳統的實作繼承可以直接延伸存取SuperClass的細節部分及存取SuperClass的屬性與方法...

如何實作繼承一個COM介面(Delphi)

圖片
//酷小毅的Delphi試鍊場 //作者: 酷小毅 //2002/03/24 於永和 如何實作繼承一個介面 (1).為何談介面的實作繼承 相信現在大家都有清楚的物件導向觀念,在物件導向中我們可以透過繼承來達到讓所封裝的類別資料有高度的Reuse特性,在COM當中則強調將介面與實作分開,這現在已可說是現在物件導向的先驅了,我們知道傳統物件導向對於繼承對SuperClass所產生的相依性不會出現在COM的世界中,而且COM對於封裝做的非常的徹底,COM的Client可說都是以介面在操作,今天筆者將介紹如何在Delphi中實作繼承別人的介面,也許是其他的ActiveX DLL or ActiveX Exe檔案,實作繼承的目的在於繼承該介面原始的行為模式,公開的介面產生它就是一個以OLE Automation技術為基礎的OLE Server,如同MS Word and Excel等等,Automation技術指的實際上就是實作IDispatch的COM物件,實作IDispatch介面又稱為雙介面(Dual Interface),目前你眼睛所看的見的Com Object 或ActiveX元件DLL, OCX等都屬於Dual Interface的物件了. 實作繼承使我們的OLE Server提供相同的介面給外界使用,那當然第一步要有原始介面囉,我們 先建立一個ActiveX Library, 接著建立一個COM Object,接著Delphi會先請你為這個CoClass取個名子,筆者取名InterfaceTest,接著我們就可在Delphi提供的TypeLibrary編輯器建立如下的Method... 整個COM Object會提供一個對外的Method,這個Method只是一個空的沒有任何程式碼的Method,因為我們將在ImplementClient的程式中去Implement它,這個空的COM Object Unit1程式碼如下所示 : //Com Object程式碼如下 unit Unit1; interface uses Windows, ActiveX, Classes, ComObj, PrjInterfaceTest_TLB, StdVcl; ...