2008年5月28日 星期三

開發 IE 瀏覽器的 Toolbar:安裝程式

開發好 IE 瀏覽器的 Plug-in 後,接下來就是要知道如何製作安裝程式,在以下這篇文章中,有提到一些做法:

Issues faced while extending IE with Band Objects using .NET and Windows Forms
http://www.codeproject.com/KB/cs/Issuewithbandobjects.aspx

這篇文章在提到安裝程式的那段中,主要是說我們可以為 MSI 設定 registration 為 vsdrpCOM,這樣安裝後就會進行註冊 dll 的動作,但是據說在 uninstall 時不會被移除。所以作者建議可以維持預設的 vsdrpNoDotRegister 不註冊,然後自己寫 Custom Actions。

首先,先在 MyToolbar 的專案中,新增一個 MyToolbarInstaller 的 Installer Class:



完整程式碼如下,重點在於 override Install 與 Uninstall 的部份:


using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;

namespace MyToolbar
{
///
/// Summary description for Installer1.
///

[RunInstaller(true)]
public class MyToolbarInstaller : System.Configuration.Install.Installer
{
///
/// Required designer variable.
///

private System.ComponentModel.Container components = null;

public MyToolbarInstaller()
{
// This call is required by the Designer.
InitializeComponent();

// TODO: Add any initialization after the InitializeComponent call
}

public override void Install(IDictionary stateSaver)
{
base.Install (stateSaver);

System.Runtime.InteropServices.RegistrationServices r = new System.Runtime.InteropServices.RegistrationServices();
r.RegisterAssembly(this.GetType().Assembly, System.Runtime.InteropServices.AssemblyRegistrationFlags.SetCodeBase);
}

public override void Uninstall(IDictionary savedState)
{
base.Uninstall (savedState);

System.Runtime.InteropServices.RegistrationServices r = new System.Runtime.InteropServices.RegistrationServices();
r.UnregisterAssembly(this.GetType().Assembly);
}

///
/// Clean up any resources being used.
///

protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}


#region Component Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///

private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}


這個 Installer Class 會一起被包進 MyToolbar.dll 中!

接著,可以在 Solution 中新增一個 MyToolbarSetup 的 Setup Project:



然後在 Setup Project 的檔案總管中,在 Application Folder 中新增一個 Assembly,請選取 MyToolbar 專案所產出的 MyToolbar.dll,系統會自動將依賴的 dll 也都包進來,其中有一個 shdocvw.dll 因為是屬於 C:\WINDOWS\system32\shdocvw.dll 的共用 dll,所以可以將之排除,設定其 Exculde 設定為 True:



順利 build 完這個 Setup Project 並執行輸出的 \MyToolbarSetup\Release\MyToolbarSetup.msi 後,會發現當我們開啟 IE 時並不會看到我們開發的 Toolbar,這是因為我們在 Setup Project 中,並未設定 MyToolbar.dll 要進行註冊:



記得 Custom Actions 這件事情嗎?若是你跟我一樣對 Visual Studio .NET 2003 沒有那麼熟的話,可以參考以下的官方說明,教你如何在 Setup Project 中指定自己的 Custom Actions:

http://msdn.microsoft.com/en-us/library/d9k65z2d(VS.80).aspx

步驟如下:









在 Install 與 Uninstall 都指定到 MyToolbar.dll,因為在 MyToolbar.dll 中有 Install Class,所以會進行一些自訂的作業。

重新 build 並執行 MyToolbarSetup.msi 安裝後,應該就可以在 IE 瀏覽器看到 Toolbar 了,記得測試一下 Uninstall 是否也會正常移除 IE 瀏覽器的 Toolbar 喔!

6 則留言:

匿名 提到...

您好,可以請問一下您的開發平台用的是...?

Ben Chang 提到...

作業系統:xp (應有 sp2 吧~現在那台 NB 已經還給公司了~)
開發工具:m$ vs.net 2003,使用 c#
測試瀏覽器:IE6

匿名 提到...

謝謝邦邦的回應,我目前是個大學生,專題剛好有一個部份是要開發一個IE的外掛,只是目前先實作其它部份!

不知以後有問題可不可以請教一下邦邦大人!

Ben Chang 提到...

恐怕我能回答你的有限,太深的問題,我自己也都是查 google 或是看別人的範例來 try error。

開發過程中,會需要一點點的 HTML DOM 的知識,這部分若是曾經有寫過 DHTML 或 JavaScript 的話,會比較有幫助。

MONKEY 提到...

其實我因為到了大三才轉學,找不到一個TEAM,只好一個人做專題,題目也是老師的構想,所以幾乎都是從零開始!
想請問邦邦『如果我用VS2005開發程式,需在程式中解讀HTML檔案(要找出所有img標記)』,這樣我該從何下手去找資料?

Ben Chang 提到...

除了 getElementById() 外,我印象中有一個 getElementsByTag(),可以得到所有 < img > 的陣列,然後就要透過其他方法來取得指定的 < img >,譬如判斷其 class,或是判斷他是否有某些 attribute。