2008年12月30日 星期二

[Inno Setup] 如何讓程式在windows啟動後自動執行

有兩種做法,一種是直接將捷徑放在"Start Menu"的"啟動目錄"裡

[Icons]
Name: "{commonstartup}\yourapp"; Filename: "{app}\yourapp.exe"; WorkingDir: {app};
Name: "{userstartup}\yourapp"; Filename: "{app}\yourapp.exe"; WorkingDir: {app};

{commonstartup}是放在共用的"啟動目錄",所有使用者共用這一個捷徑。
{userstartup}則是放在該user的"啟動目錄"。

另一種做法是寫registry

[Registry]
Root: HKCU; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "yourapp"; ValueData: "{app}\yourapp.exe"; Flags: uninsdeletevalue;


上面兩種方法都可以讓你的程式在每次啟動windows時自動執行。

2008年12月19日 星期五

[Inno Setup]檢查程式是否已安裝,並且詢問user是否要安裝舊版程式

我有一個用COM寫的dll,因為會給很多支程式一起發佈,這種清況下有可能使用者剛好安裝到舊版本的dll,雖然這樣不是什麼大問題,但是我還是希望使用者盡量使用最新的dll(不安裝舊版程式),因此我在Inno Setup加入一小段pascal code去解決這個問題。


[Setup]
; your setup setting

[Code]
function InitializeSetup(): Boolean;
var version: String;
begin
result := true;
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\yourapp', 'DisplayVersion', version) = true then begin
if CompareStr(version, '1.1.5.0') > 0 then ; 1.1.5.0是你最新版的version
if WizardSilent() = false then begin ; Silent就預設不安裝舊的
if MsgBox('Would you like to install the older version?', mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDNO then begin ;詢問user
result := false;
end;
end else begin
result := false;
end;
end;
end;


Note:
1. 原本是以為Inno Setup有這個選項可以設定,不過找了一下還是沒找到,所以就自己手動弄了.. XD

2008年12月18日 星期四

VC9 SP1 Hotfix For The vector> Crash

今天在Visual C++ Team Blog 看到 這一篇,官方有針對VC9 的SP1釋出一個修正檔,主要是根據這邊的bug list修正了底下5個問題

1. function<FT>::swap() was broken by the Small Functor Optimization in VC9 TR1 (the Feature Pack). This broke vector<function<FT>> in VC9 SP1. "Broken" meant "compiling but crashing".

2. vector<pair<X, string>> nonconformantly required X to have a default constructor. (This is a specific example of a general bug: vector<pair<string, X>>, vector<pair<X, vector<int>>>, etc. were also affected.)

3. vector<tuple<X, Y, string>> nonconformantly required X and Y to have default constructors. (This is a specific example of a general bug, see above.)

4. vector<array<X, N>> nonconformantly required X to have a default constructor.

5. Random distributions were broken, triggering infinite loops and emitting bogus results.

假如你有安裝VC9 sp1的話,可以更新一下 :)


References:

1. Visual C++ Team Blog

2. VC9 SP1 Hotfix For The vector> Crash

3. TR1 fixes in VC9 SP1

2008年12月16日 星期二

一個免費的安裝程式 - Inno Setup

如果你還在找一個適合的安裝程式 (ex: Visual C++ 、BCB的安裝程式),且不想用原本complier附的安裝程式的話,可以試試這一套「Inno Setup」,他是免費的,而且只需要寫一些簡單的script,我個人用起來還簡單好用的。(我有用過在Visual C++ 2005, 2008以及BCB6和WinCE的安裝)

底下我將比較常用的script列出來
[Setup]                           ; 設定頁面
AppName=MyApp ; 程式名稱
AppVerName= MyApp 2.0 ; 程式版本名稱
AppVersion=2.0.0.456 ; 版本
DefaultDirName={pf}\MyApp ; 安裝的預設目錄 {pf}是指Program Files
DefaultGroupName=MyApp ; 在「開始/程式集」的目錄
Compression=lzma ; 壓縮的方式
SolidCompression=yes ; 安裝程式是分佈多個檔案或是合併成一個檔案
OutputDir=..\..\bin\ ; 輸出安裝程式的目錄
OutputBaseFilename=MyApp 2.0.0 ; 輸出安裝程式的名稱

[Files] ; 你要發佈的檔案清單
; Source: 來源路徑
; DestDir: 目地目徑,{app}可能是DefaultDirName或user自訂
Source: MyApp.exe; DestDir: {app};
Source: MyApp.dll; DestDir: {app};
Source: help.txt; DestDir: {app}\help; Flags:

[Dirs] ; 要建立的目錄
; Name: 要建立的目錄路徑,其中{userappdata}是指user的My Documents目錄
Name: "{userappdata}\MyApp";

[Icons] ; 要建立的shortcut
; Name: shortcut的名稱,其中{group}可能是DefaultGroupName或user自訂
; Fileanme: shortcut要對映的名稱
; WorkingDir: shortcut的預設執行目錄 (這要記得加喔!)
Name: "{group}\MyApp"; Filename: "{app}\MyApp.exe"; WorkingDir: {app};

; {uninstallexe}是指uninstall的路徑
Name: "{group}\Uninstall"; Filename: "{uninstallexe}"; WorkingDir: {app};

[Run] ; 要執行的程式
; Filename: 程式名稱
; Description: 你的程式描述
; Flags:
; postinstall: 安裝程式後才會執行
; nowait: 安裝程式不會等待程式執行完畢,並且繼續下一步動作
Filename: "{app}\MyApp.exe"; Description: "Launch application"; Flags: postinstall nowait

更多設定項目請參考Inno Setup附的example或是help。
或是參考FAQKnowledge BaseMailing List


Inno Setup可以透過簡單的pascal語法來寫一些程式,例如自訂畫面、資源檢查或是檔案的操作,如果嫌Inno Setup的指令太少,那你可以外掛一些用C寫的dll來和pascal配合,來增加Inno Setup的指令及功能。
底下是一個簡單在Welcome的畫面時顯示MsgBox。

procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID= wpWelcome) then begin
MsgBox('Welcome to Inno Setup.', mbInformation, MB_OK);
end;
end;


另外,網路上很多人為Inno Setup寫了一些額外的套件,可以直接使用UI來設定script或是增加#include來引用已寫好的script等功能,有興趣的可以下載Third-Party QuickStart Packs來玩玩。


結論:
Inno Setup是一個免費又簡單好用的安裝程式。 :)


下載 (Downloads):
1. Inno Setup Stable Release - 主程式
2. Third-Party QuickStart Packs - 包含常用的third-party元件

一些Inno Setup的技巧:
1. Inno Setup 包裝 Visual C++ runtime library
2. Inno Setup 如何在安裝程式前,先檢查並關閉之前的程式
3. more

Reference:
1. Inno Setup

2008年12月15日 星期一

Discovery廣告- 世界無比精采! Boom De Ah Dah



歌詞:
Astronaut1:It never gets old, uh?
太空人1:地球從不會變老,對吧?
Astronaut2:Nope.
太空人2:不。
Astronaut1:it kinda make you want to break into songs?
太空人1:真令人想高歌一曲不是嗎?
Astronaut2:Yep.
太空人2:就是啊。

I love the mountains
我愛高山。
I love the clear blue skies
我愛藍天
I love big bridges(建築奇觀)
我愛大橋
I love when great whites fly
我愛飛躍的大白鯊

I love the whole world
我愛全世界
and all its sights and sounds
我愛這個聲色世界

Boom De Yada(這邊好像是漁人的搏鬥)
Boom De Yada
Boom De Yada
Boom De Yada﹗

I love the ocean
我愛海洋
I love the dirty things(幹盡苦差事的主持人Mike Rowew)
我愛苦差事
I love to go fast
我愛速度感
I love Egyptian kings
我愛埃及法老王

I love the whole world
我愛全世界
and all its craziness
我愛這瘋狂的世界

Boom De Yada
Boom De Yada
Boom De Yada
Boom De Yada(新時代武器的Richard Machowicz)

I love tornado(追風日誌)
我愛龍捲風
I love arachnid(Bear Grylls荒野求生密技)
我愛蜘蛛
I love hot magma
我愛岩漿
I love the giant squids
我愛大章魚

I love the whole world
我愛全世界
it's such a brilliant place
這世界實在太讚

Boom De Yada(流言終結者的亞當和傑米)
Boom De Yada(霍金博士w)
Boom De Yadaaaaaaaa
Boom De Yada
Boom De Yada
Boom De Yada
Boom De Yada
Boom De Yada
Boom De Yada
Boom De Yada

2008年12月13日 星期六

base class的virtual destructor的補充

我是習慣讓base class有virtual destructor,因為大部分我都是需要做多型刪除(polymorphic deletion)的,主要觀念是從C++編程規範來的,我節錄一下書裡編號50的準則


令base class的解構式為public virtual或protected nonvirtual
摘要(Summary):
刪還是不刪,真讓人頭疼:如果允許透過pointer to Base來刪除物件,那麼Base的解構式必須是public virtual函式。否則它應該是protected nonvirtual函式。


意思指的是


客戶要不就應該透過pointer to Base進行多型刪除(polymorphic deletion),要不就不該刪除。


如果允許多型刪除的話,那解構子就應該是public且為virtual function。
反之若不希望客戶進行多型刪除的話,那解構子就設計為nonpublic且nonvirtual。


上述這種判斷方式會比「將所有base class都固定加入virtual dtor」來得好。 :)


例外狀況


你可以讓解構式是public且nonvirtual,但必須在文件中清楚說明:B的更深層衍生物件(further-derived objects)絕對不能被多型使用(當作B)。std::unary_function就是這樣。





Notes:
1. base class指的是那些"準備要被繼承的底層類別"。

2. 並不是要將所有class都加入virtual dtor,而是如果該class可能會被繼承且需要支援多型刪除的話,那就加入virtual dtor,反之,如果該class根本不會(或是不希望)被繼承的話,那就不需要加入virtual dtor。

3. virtual dtor常常可以用來識別class能否被繼承。

4. 至於像unary_function這種class,除了文件註明外,解構子可以考慮設計為protected。 (這個書上也有提到)

Reference:
1: C++編程規範 - 101個準則、指導方針,和最佳實踐 - 侯捷/陳碩 譯
2.
Re: ‘dynamic_cast’ : ‘A’ is not a polymorphic type - http://fsfoundry.org/codefreak/
3.
http://legnaleurc.blogspot.com/2008/11/2.html
4.
'dynamic_cast' : 'A' is not a polymorphic type


因為感覺這一篇寫得不夠完整且完整表達我的想法,因此我有稍微修改過。

2008年12月9日 星期二

Ultimate Toolbox原來已經是免費的了啊

最近工作上需要使用TreeCtrl做多選(Multi-Select)的操作,因為MFC的CTreeCtrl預設是不支援多選的,因此我試著在CodeProject或是CodeGuru找尋解答,以前一直都是直接套用別人改寫的元件,但是也因為該元件並非正式的,常常都是沒有文件而且缺少維護,存在著很多bug,而我其實也沒啥時間去解那些bug,後來想說來查一下Ultimate Toolbox這套商業元件目前的售價好了,再來跟我主管商量看看要不要撥經費來購買,後來發現Ultimate Toolbox, Grid, TCP/IP都已經變成免費而且open source的了,以前小時候(咦?)的印象他是商業套件而且是需要錢的啊,怎麼會突然變免費的呢(2007年8月開始open source的),後來上網查了一下,我猜想可能是因為他的另一對手BCGSoft和微軟合作的關系,並且在Visual C++ 2008 Feature Pack加入大量且免費的BCGSoft元件,因此逼得使Ultimate Toolbox也必須改變策略而選擇open source一途吧。

也正好,Ultimate Toolbox剛好有我需要的TreeCtrl,而且比我現在使用的網路免費的元件還強得多很多,真是謝天謝地啊 XD

後記
其實Visual Studio 2008 Service Pack 1(包含Visual C++ 2008 Feature Pack)裡加入了大量的BCG元件(MFC Hierarchy Chart),用起來方便很多,不再需要為GUI來煩惱,也不太需要上網四處搜尋元件了,可以專注在更核心的問題。
不過,為什麼還是沒有高階(完整)的TreeCtrl呢?? =.=.. 我只是要做一個Multi-Select而已啊
結果還要花時間再找解決方案以及編譯Ultimate Toolbox.. orz


ps. 我還真是後知後覺。

LinkWithin

Related Posts with Thumbnails