2015/05/31

Inno Setup : 上書きインストールかどうかを確認する

インストーラーを作成するのに、いろいろ便利なので最近は
Inno Setup
http://www.jrsoftware.org/isinfo.php
というのを使っているのだけど、
ちょいとその小ネタを。

Inno Setupには、前回インストールしたものに対して
バージョンアップしたものを上書きインストールしたい場合に、
前回インストールしたときのフォルダを検出して
自動的にそこにインストールしたりしてくれるような
機能が用意されていたりはするのだけど、
「旧バージョンがインストールされてるけどアップデートする?」
的なメッセージを表示させるような機能は用意されていないので、
それを作ってみた。


・・・作ってみたのだが、
これがまた簡単そうで意外と面倒くさかった。
[Code] セクションで自前でスクリプトを書かなければならず、
全く書いたことのなかったよくわかんらんPascal言語の文法で
悩まされることに・・・。

未だに If - else 構文の理屈がよくわんねー


ま、それは置いといて、
こんな感じのスクリプトになった。

[Code]

// ------------------------------------------------------------
// 前回インストールしたアプリケーションの情報が格納されている(はず)の
// レジストリのパスを返す関数。
// Inno Setupで作成したインストーラーは、
// ここにアプリケーション名やらバージョンなどの情報を格納している。
// (試しに regedit で覗いてみるのがおすすめ。)
// ------------------------------------------------------------
function GetAppInstallRegKey() : string;
begin
  Result := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\([Setup]セクションのAppIdに設定した値)';
  
end;


// ------------------------------------------------------------
// 上書きインストールかどうかを調べる関数。
// (レジストリに別なバージョンのインストール情報があるかどうかを調べる。)
// ------------------------------------------------------------
function IsUpdateInstall() : Boolean;
var
  key : string;
begin
  key := GetAppInstallRegKey();

  if RegKeyExists(HKEY_LOCAL_MACHINE, key) then begin
    Result := true
  end else begin
    Result := false;
  end;

end;


// ------------------------------------------------------------
// すでにインストールされているヤツのバージョンを取得する関数。
// ------------------------------------------------------------
function GetPrevVersion() : string;
var
  prevVersion : string;
  key : string;
begin
  key := GetAppInstallRegKey();
  if RegQueryStringValue(HKEY_LOCAL_MACHINE, key, 'DisplayVersion', prevVersion) then
  begin
    Result := prevVersion;
  end;

end;


// ------------------------------------------------------------
// インストール開始時に呼び出される関数。
// ------------------------------------------------------------
function InitializeSetup(): Boolean;
var

  // すでにインストールされているヤツのバージョン
  prevVersion : string;

  // 上書きインストールを実行するかどうか
  doUpdate : Boolean;

begin

  // 別なバージョンがインストール済みかどうかを確認して、
  if IsUpdateInstall() then begin

    // そうなら、前回インストールしたヤツのバージョンを取得して、
    prevVersion := GetPrevVersion();

    // メッセージを表示。( #13 で改行文字が入るらしい。)
    // Yes が選択されたら 変数 doUpdate に true が入る。
    doUpdate := MsgBox('バージョン ' + prevVersion + ' がすでにインストールされています。' #13 'バージョン (ほげほげ) で上書きインストールを実行しますか?', mbConfirmation, MB_YESNO) = idYes;
    
    if doUpdate then begin
 
      // Yes が選択されたら、この関数の戻り値に true を設定。
      Result := true;

    end else begin

      // No なら、キャンセルされる旨のメッセージを表示して、
      MsgBox('セットアップはキャンセルされました。', mbInformation, MB_OK);

      // 戻り値に false を設定。
      // この関数が false を返すと、セットアップが中止される。
      Result := false;
      
    end;
    
  end else begin

    // 新規のインストールなので特に何もしない。
    Result := true;
    
  end;

end;


あと、[Setup]セクションで、

DisableDirPage=auto
DisableProgramGroupPage=auto

と書いておく。

DisableDirPage は、
インストール先ディレクトリの選択画面を表示するかどうかのオプション。

DisableProgramGroupPage は、
スタートメニューに作成するプログラムグループを指定する画面を
表示するかどうかのオプション。

これらを、"auto" にしておくと、
新規インストールの時はその画面が表示され、
アップデートするときは表示されずに前回インストール時の
ディレクトリなりプログラムクループなりが自動で選択されるようになる。



2015/04/26

こっそり更新中

ずいぶん久しぶりの投稿になってしまったけど、
まぁ、毎度のことなのでそれは置いとくとして。

ImgViewerをこっそり更新してます。
何となく自分で使っていて不便なところをちまちまと。

画像の表示順を
WindowsのStrCmpLogicalW関数を使って
エクスプローラーの表示順に合わせてみたり、
FreeImageで画像のメタデータ(Exif情報とか)を簡単に取得できるので、
それを見れるようにしてみたりとか。

最近はあんまり新しいソフトウェアを作るネタも時間もないのだけど、
たまーに何かコードを書きたくなるんだよね・・・。
や、仕事ではいつもコード書いてるんだけど、
それとは別に、趣味というかお遊び的に好き勝手に
なにか気の向くままに作りたいというか。

そういや、Visual Studio を 2012 Expless に乗り換えたのだけど、
インストーラーが前と同じ方法では作れなくなってしまったので
なにかいいのはないかと探していたのだけど、
「Inno Setup」
というのが便利そう。

インストーラーとして必要な機能はほとんど一通りそろっているし、
スクリプト書けば、かなりいろいろできそうだし。

ただ、使っているユーザーは多そうなのだが、
どうにも日本語の情報が少なくて少々苦労する・・・。

あと、Pascalの文法が謎。
情報少なすぎるし、
if elseの構文が未だにどーいう理屈なのかよくわからん。

2013/01/01

明けましておめでとうございます

今年もよろしくお願いします。

ということで、
今年の年賀状用に作ったCGです。



昨年とおんなじ感じで、
あえてポリゴンのカクカクした感じのデザインで。
テクスチャ作るのが面倒なので、ヘビの模様は無し。

文字の部分は、
はじめ、ガラスっぽく作ったら読みにくくなってしまったので、
正面側に不透明なポリゴンを貼ってみました。

ヘビの頭は、
ローポリゴンでカクカクしつつも、
それっぽくできたのではないかと思いますが、
いかがでしょうか?

(QRコードはブログ用に差し替えてあります。)

2012/11/13

FreeImage : インデックスカラーをRGBAに変換する

忘れそうなのでメモ。

前に書いた、FreeImage.NETというライブラリで、
PNG形式とかでインデックスカラーの画像を読み込んだときに、
それをRGBA形式に変換する方法。


//ファイルから画像を読み込む
FreeImageBitmap fiBmp = new FreeImageBitmap( fileName, fiLoadFlags );

//パレットを持っている(=インデックスカラー)なら
if( fiBmp.HasPalette )
{
    //これでRGBA形式に変換される。
    bool res = fiBmp.ConvertColorDepth( FREE_IMAGE_COLOR_DEPTH.FICD_32_BPP );
}

2012/10/30

3D Vision のメガネを改造してみた

最近、PSO2を3D Vision(残念ながら「2」ではない)で遊んでいることが多いのだが、
あのメガネ、なんか、
やたらと耳に掛ける部分の幅が狭くて、
こめかみのあたりが痛い。
もう、1時間ぐらいが限界。

いい加減、かけ心地の悪さが我慢ならなくなってきたので、
どうにかしてやろうと。

・・・で、
こうなりました。



1.ツルの緑のラバーのあたりから、ペンチでバッサリと切り落とす。

2.半田ごてで、直径3mmぐらいの穴を、ぷすっと開ける。

3.切り口と、穴の縁を、やすりとかで丸める。

4.その辺にあった要らないネックストラップのひもを調達。
ひもは2つに切り分ける。

5.開けた穴にひもを通して結びつける。

6.メガネを掛けてみて、ひもを頭の後ろで、メガネがずり落ちないような感じに結ぶ。

以上。

かなーり、適当な工作ですが、
頭の脇で締め付けられていたのが無くなって、かなり快適に。


ただし、注意点。

・液晶シャッター部分はガラス製。
無理な力がかかったり、傷が付かないように注意すること。
この部分を、メガネふきとか包んだ状態で作業するべし。

・半田ごてで穴を開けるときは、手早く。
プラスチックが焦げると、非常にクサイので。
あと煙を吸わないように。

・ツルの根元のほうの内側、膨らんでいるところは、
おそらく回路やバッテリーが入っているので、
そのあたりには手を加えてはいけない。

・当然ながら、改造は自己責任で。



しかし、こうネタを全く見かけないのだが、
3D Visionのメガネのツルがきついのは、私だけ?

2012/06/11

シンプルな画像ビューワーを作ってみた。

また、FreeImageを使ってちょっとしたツールを作ってみました。
今度は、OpenTKも使って、シンプルな画像ビューワー。

FreeImageで画像ファイルを読み込み、
OpenGLでレンダリングしてます。
 Windows XP以上、.NET Framework 3.5以上が必要。
あと、5ボタンマウス推奨。

前から、Windows標準の「Windowsフォトビューアー」の
ボタンとかウィンドウの枠とかがうっとうしいと思ってたので、
枠もボタンも無い、可能な限りシンプルなものにしてみました。

画面上に、画像だけが表示されます。
あとは、右クリックで申し訳程度のメニューが出るだけで、
他には何にもありません。


基本的にマウスで全て操作します。
ドラッグ&ドロップで画像を開いたり、
左ドラッグで画像(ウィンドウ)を移動、
マウスの「進む」「戻る」ボタンで次/の画像を表示、
ホイールで拡大・縮小とか。
ウィンドウがディスプレイの縁にスナップしたりもします。

詳しいこととダウンロードはこっちにて。
-> シンプルな(すぎる)画像ビューワー (ImgViewer)

前回のクリップボードの画像保存ツールでは、
FreeImageを画像をファイルに保存する部分に使ってたけど、
今度は、画像をファイルから読むところに使ってます。

起動するのがちと遅いのだけれど、
たぶん、OpenTKとかGLSharpとか、
DLLがそこそこ大きなファイルサイズだからかも。
ごく一部の機能しか使ってないから、
そのあたりをゴリゴリ削ってしまうのもいいのかもしれない。

 FreeImageに関しては、試してみた感じだと、
画像ファイルの読み込みは.NET FrameworkのBitmapクラスよりも少し遅い。
まぁ、その辺は、特にJPEGに関しては画質はFreeImageのほうが信頼できるので、
仕方ないのかなと。

あと、OpenGLを使って
画像をテクスチャとしてロードしたりレンダリングしたりするので、
GPUが非力だと、読み込みやレンダリングが重くなるかも。
まぁ、最近のGPU統合型のCPUなら、
そこそこ動くんでは無いかと思いますが。

2012/03/30

FreeImageを使って作ってみた。

HPのほうだけアップして、
すっかりこっちの更新を忘れてましたが。

だいぶ前の記事で書いたFreeImageを使って、
ちょっとしたツールを作ってみました。

クリップボードの画像保存ツール

名前通り、
Windowsのクリップボードに取り込んだ画像を
画像ファイルとして保存するツールです。

画像を保存するところを、FreeImageに任せてます。

作ったプログラムについてはそっちのページを見てもらうとして、
ここでは、FreeImage関連について。

FreeImageを使うと、
JPEGの画質などもちゃんと指定することができます。
今回作ってみたプログラムでも使ってます。

GIF形式も、アニメーションに対応していたり、
RGB 24bit から 256色への変換アルゴリズムが2種類用意されているようです。

使ってみた感じだと、
.NET FrameworkのBitmapクラスと比較すると、
いくぶんか、FreeImageのほうが
画像ファイルの読み書きの処理が重いような気がします。
また、Bitmapオブジェクトから
FreeImageでの画像オブジェクトへ変換する必要があるので、
そのへんでも余分に手間がかかる。

しかし、エンコード、デコードの正確さや、
各画像形式でのオプションの指定、
Exif情報も割と簡単に扱える、
利用できる画像形式が豊富、
など、FreeImageには利点も多いです。

画質を気にしなくていいようなときは手軽にBitmapクラス、
そうでない、画質を気にするべきところではFreeImage、
とか、場合によって使い分けるのが良いかも。