發表文章

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; ...

Win32程式設計技術

圖片
//2002/2/21 酷小毅於永和 (1).Win32的記憶體管理 各位若有經過Win31時代,玩過Win31也就是Win16的應用程式應該會發現,在win16下的應用程式共用相同的記憶體位址空間,在Win31下所有被執行的應用程式(Process)他們會存取到一塊由Windows所提供的一塊記憶體空間,也就是說應用程式可能會不小心存取到被其他應用程式所使用的記憶體位址,嚴重時甚至造成系統死當.而在Win32下Windows會載入一種稱為保護模式(不是win9x當機時進去的保護模式),在這個模式下會由Windows來掌控所有的 應用程式 Process, Thread,所有的應用程式訊息,使用者所產生的訊息包括鍵盤滑鼠等訊息,都必須透過Windows來達成,包括應用程式之間要存取另一個應用程式的資料或存取CMOS/BIOS資訊都必須透過Windows來達成,所以Windows當然回提供一系列windows的介面來完成這些事,這個介面就是Win32 API(Application Programming Inteerface). (2).Event driven事件驅動概念 Windows是一個充滿訊息的環境,在Windows下不斷的都有訊息流動,有時是Windows的訊息有時為System的訊息,有時是User的訊息,給應用程式的訊息經由應用程式轉換成事件,在交由應用程式相對應的事件處理常式來處裡該事件,有些則可能是某應用程式Send給其他應用程式的訊息,有些是使用者透過鍵盤滑鼠所產生的訊息,若將訊息分類則可分為:(1)Windows message (2) Application message. (3)User message.等,不過若對應用程式而言訊息就是訊息沒什麼不同,應用程式通常會有如下的一個while迴圈來接收並指派訊息給對應的處裡常式處裡 while(GetMessage(&Msg, null, null, null)) {     TranslateMessage(&Msg);     DispatchMessage(&Msg); }  在Windows下每一個視窗裡都會有處裡這些訊息的處裡函式來處裡執行相對應的動作,Windows...

從OLE到COM、Automation、ActiveX技術

圖片
//2002/2/3 //酷小毅 一、 COM 基本概論 1. 什麼是COM(Component Object Model). COM,在幾年前幾乎就已經微軟對於所開發軟體使用的一種標準,COM的前身其實就是微軟在1993年推出的OLE2,OLE(Object Linking and Embeded)物件的連結與崁入,為早期一種復合式文件技術,能單一的文件(也可說是物件)內崁連結另一份文件的技術,這已經是一種物件間連結溝通的一種協定的技術,當時有人稱為OLE Control,ActiveX,因為增早期對這些名詞的制定過於寬鬆,加上許多人很難區分出什麼是OLE什麼是ActiveX,其實它們指的都是以COM為基礎的技術。 COM是建構軟體的一種標準,在Win32下是行程與行程間溝通的一種基準,一種協定,COM是一種以物件導向(OOP)為基礎,是一個以二進位重複使用(Binary Reuse)為基礎的架構,這意味著COM不但發揮OOP的長處,二進位重複使用使COM並不需要任何原始程式碼就可重複使用,所以只要是支援COM的程式它們只要了解介面即可相互溝通不需寮解對方的實作以及使用何種程式語言。 2. COM 以介面為基礎的設計方式 以介面為基礎的程式設計方式可說是COM的精神,此部份觀念相當重要,觀念了解了在談如何充分發揮以介面為基礎程式設計的好處。   介面的構成(TypeLibrary) TypeLib為COM定義介面(Interface)一種二進位構成檔,TypeLib中定義了此COM物件中的Class(CoClass),方法(Method)及屬性(Property),TypeLib可為單獨的一個檔案(可能是.OLB或.TLB,.OLB檔案則為.TLB的前身,為早期的COM物件),也可能和.OCX或.DLL或.EXE Bind在一起。   IDL(Interface Definition Lenguage) 簡介 一個COM的Client在RunTime時連結到一個Object,但是它再編譯時還是得要告訴他COM Server提供給他什麼樣的方法屬性等,那COM當然要提供一個描述COM Interface及CoClass的一種標準,因介面是要被公開的,當然那就是IDL語言,既然COM就是要達到語...

物件導向OOP基礎概論 (以Delphi為例)

圖片
(一)、 何謂OO(Object Oriented)物件導向的程式語言 1. 類別與物件 傳統的程式設計概念將程式碼與資料視為分離的個體,程式雖然可以使用存取資料,但是資料並沒有受到保護,任何人都可以不當的存取資料﹔但是物件導向的程式設計則將程式與資料視為不可分離的實體,程式當然還是可以存取資料,只不過得勞駕物件當中的Method來幫你存取。 不過究竟什麼是類別﹔物件又是什麼?!許多初學者常感到疑惑的問題,我想我可能無法讓你聞道或是摸到物件,不過告訴你到哪裡找到相關資訊﹔而事實上 類別 (Class) 是一些物件的靜態定義,它就是定義著一些構成其類別之物件的資料型態及程式碼,有些初學者以為類別與物件沒什麼不同,那我想它還沒真正接觸了解一個類別,其實這連程式碼的定義結構都不同, 物件 就好比是類別當中的一個 變數 ,而最大的差別就是它不只是當一般變數而已, 物件 可以是定義的資料型態或是 方法 ( Method )、程序(Procedure)、函式(Function)。 2. 物件的內容 在Delphi環境中到處是物件,你在 元件盤 (Object Inspector)上所看到的,還有程式設計所用到的元件,或者某些物件的特性就是一個物件,如或一般表單(Form)、Button、Memo、CheckBox等等可視元件(視覺化的看的見的)上都會有的Font屬性、或 MainMenu 元件的Items屬性都是一個物件,甚至表單本身也是個物件,一般我們要定義一個物件會先定義這個物件的類別,如圖一:當Delphi開一個新 Application Project 時就已經幫我們建立起一個 繼承 於 TForm 的 Form1 類別,此類別中我們使用了一個TButton元件( VCL 類別 ),也使用了TButton的Click方法, 記住:在 Delphi中你所看到的以T開頭的即是一個類別〔也就是一個VCL類別,因為Delphi的Framework是VCL(Visual Component Library)〕 ,如此範例中我們使用了 TForm 及 TButton 這兩個類別。 圖(一): ( 二) . OO(Object Oriented)的基本特性 (1). Encapsulation .封裝 (2). Inheritance 繼承 ...

OLE Automation應用

圖片
'2001/10/02 酷小毅(永和) 大綱: 一、 從頭說起OLE Automation (套Word製作報表) 二、 如何取得Word Automation所提供的服務 三、 如何控制Word新增表格 四、 如何將資料插入Word表格 五、 如何在同一份文件中複製相同的表格到下一頁 六、 完整範例程式列表 相信這是每一個程式設計師都有的經驗,辛辛苦苦寫完資料庫程式之後這些程式身邊還得伴隨著一個個漂亮至制式報表,老實說我還真沒什麼美感,要我在寫完程式之後還要去編排這些報表這實在是件辛苦的差事,若能透過Automation請Word幫我們製作報表可以減輕不少的負擔,再加上Word 所建立出來的Template Files可以Reuse,只要有Microsoft Word的機器即可開啟編輯,現在要找到沒有Word的機器我想也很難找到了,以前有前輩以Delphi為範例介紹,現在小弟我就以Visual Basic為範例介紹,二話不說,我們開始吧。 如何取得Word Automation所提供的服務 下圖為建立Word Automation Application所需的程式碼,小弟我以Visual Basic為範例介紹,二話不說,我們開始吧 如何取得 Word Automation 所提供的服務 下圖為建立Word Automation Application所需的程式碼,小弟我以CreateObject為範例介紹,當然你也可以使用VB最簡單的方式直接引用TypeLib方式,不過這樣此程式就只能固定的被使用在所勾選的特定Word版本,因為你如果直接勾選VB會將他所使用到該元件(Component)的相關 TypeLib一起Compile在執行檔中,無形中就寫死了,一般如果是特定元件的使用(如常常可能會修改,但不改介面)我會建議以原生物件的呼叫方式,不過當然這樣就享受VB整合是開發式環境 (List Properties Method)的好處了,以我的習慣會先引用,然後待開發完成之後再將所有宣告改成Object,改以CreateObject建立原生物件不彷提供給讀者做參考。在上面的程式碼也很簡單,我先以On Error Resume Next加以宣告,若建立Word發生錯誤則秀出建立Word發生錯誤訊息。 如何控制 Word 新增表格...