C#

Visual C# 2005 Expressインストール

今までβ2のVisualStudio 2005を使っていたのだが、正規版が無料で出たというのでインストールしてみた。私はC#しか使う予定が無いのでVisual C#をインストールした。
まずはβ2をアンインストールしなければならないということで、専用のアンインストールツールを使った。その後、Visual C# 2005 ExpressのCDイメージをマウントしてインストールを行った。β2のころはインストーラーがインストールできるもの全部入れていたのですごい容量ですごいインストール時間だったが、今回はVisual C#だけだったのでそれほどでもなかった。
とりあえず最近開発したImageViewのプロジェクトを読み込ませてみたが、特に問題はなさそうだった。結構古いPCで使っているので製品版での速度アップも期待していたのだが、そういうものは無さそうだった。少なくとも便利に感じたのはヘルプが日本語だったことくらいか。
ついでにImageViewで見つけていた幾つかの不具合を直してみたりしたが、私にはExpress版で十分だなと実感した。無料でこれだけ使えるものがあるってのは良いな。

| | コメント (0) | トラックバック (0)

ImageView その4

段々と実用域に達してきたImageViewだが、今日はアーカイブファイル内のファイルをソートするようにしてみた。ジェネリックを使ったListのSortメソッドを使ったが、匿名メソッドを使って簡単に実装することが出来た。便利ですな。また前回発見したZIPファイルハンドリングの問題だが、一応回避コードを入れて正しく扱えるようになった。しかし、ファイル名の正規表現展開を抑止するオプションが欲しいところだ。
段々と実用域に達してきたからこそ感じるのがスライドショーの遅さだ。ボタンを押すとファイルを読み込んでデコードして表示するわけだが、デコードとリサイズ表示に時間が掛かっているようだ。デコードは.NET Frameworkの機能を使っているので速度アップするのは難しい。そこでなんとか体感速度だけでも速くしたいと考えているが、やはりマルチスレッドで先読みならぬ先デコードを行うくらいしか思いつかない。マルチスレッドプログラムはあまり行ったことが無いので、うまく出来るか不安だ。

| | コメント (0) | トラックバック (0)

ImageView その3

ちまちまと進めているImageViewだが、平日は帰るのが遅いのでほとんど進まない。しかし今日は特定のZIPファイルが扱えないという現象の原因が分かった。話せば単純なことなのだが、ZIPファイル内に格納されているファイルのフルパス名に、「[?]」が含まれていたのである。Unzip32ではファイル名に正規表現が使えるようになっており、今回は「[」が正規表現のデータだと判断されたのである。よって特定の文字をエスケープすれば正しく扱えるようになった。Unlha32ではファイル名にワイルドカードが使える程度で正規表現まではサポートしていない。よって同じように格納されたアーカイブファイルであってもLZHは正しく扱えたのである。
原因は分かったのだが、LZHを展開するときに同様にエスケープすると正しく処理されない。やはり展開に使うDLLごとに色々と処理を分けないといけないようだ。それを行うためにはアーカイブ展開クラスをかなり修正することになりそうだ。

| | コメント (0) | トラックバック (0)

ImageView その2

週末ごとにコツコツと作っているImageViewだが、今週はあまり進まなかった。とりあえずコマンドライン処理と最大化したときにウィンドウタイトルを隠す処理、ショートカットキーなどを設定したが、特定のZIPファイルが正しく扱えないという問題はまだ回避できていない。
特定のZIPファイルが扱えないという問題だが、現在の状況としてはZIPファイルに含まれているファイルの一覧は正しく取得できているのだが、UnZipExtractMemを実行するとERROR_FILE_OPENが返って正しく処理できないというもの。UnZipCloseArchive直後に実行しても同様のため、ZIPファイルが開けないということは無いと思うのだが。またパス内にスペースが含まれている可能性があるため、ZIPファイル名と取り出すファイル名は両方ともダブルクォートで囲ってある。どうもERROR_FILE_OPENを返す原因は取り出すZIP内のファイルにあるようなのだが、まだ規則性のようなものまでは調べていない。UnZipExtractMem特有の問題かもしれないので、メモリ内展開を諦めると回避できるかもしれない。
ZIP問題は置いておいて、次に考えているのは画像デコードの非同期化だ。スレッドを使ってうまく処理したいが、排他処理なども考えなければならない。まあスレッド処理も排他処理もDelphiよりは自由度が高そうだし、うまい方法を考えたいものだ。

| | コメント (0) | トラックバック (0)

ImageView

先週からC#で作っている画像表示アプリはとりあえずImageViewという名前にしてみた。現在のところ、ファイルをD&Dしたらそのファイルを表示、フォルダをD&Dしたらその中の画像を順に表示、画像はウィンドウサイズにアスペクト比を保ったままで拡大縮小する、といったところまで出来ている。画像のデコードは.NET Frameworkに付いているJPEGとかPNGのデコーダーをそのまま利用、拡大縮小はバイキュービックが使えるので画質的には問題が無い表示ができている。
今日取り組んだのがLHAやZIPでまとめられたファイルをそのまま表示する機能。画像表示アプリとしては一般的な機能だ。アーカイブファイルの展開はUnlha32.dllなどを使うので特に難しくは無いが、こだわったのがアンマネージなDLLファイルをハンドリングする方法だ。C#では一般的に[DllImport]を使ってアンマネージなDLLを使えるようにするが、それだとアーカイバが提供する機能をハンドリングをするのに非常に多くの[DllImport]を書かなければならず美しくない。C++やDelphiだとLoadLibraryとGetProcAddressを使ってダイナミックリンクする方法が取れるが、C#ではGetProcAddressで取得したメソッドのアドレスを実行する方法が無い(全く無いわけではない。ここなど参照)。
しかし今回使っているのはVisual Studio 2005のため、.NET Frameworkは2.0となる。2.0からはこのGetProcAddressで取得したメソッドのアドレスを実行する方法が提供されている。詳しくはここなどを参照するとよい。結構おまじないとして書かなければならないコードが多いので、今回の統合アーカイバAPI仕様のDLLを扱うときのようにGetProcAddressが効率よく使える場合でなければ面倒が増えるだけかもしれない。でも「DLLがあれば使う」というタイプのコーディングができるので、使える場面は結構ありそう。
結局ImageViewではUnlha32とUnzip32だけを使うようにしてあるが、他のDLLを使うようにするのも簡単。アーカイブファイルの中のファイルの取り出しもメモリ経由で行うようにしたのでそれなりに効率は良いはず。ただ、どうしても正しく表示できないファイルがあり、検証したところアーカイブ内にフォルダが作られているタイプのzipで問題が出ている模様。同じフォルダ構成でlhaでは問題が出ていないので、zip固有の問題なのかも知れず。
次なる実装点として考えているのが速度の向上とコマンドラインからのファイル投入。コマンドライン処理を入れるまえに現在のクラス構造を見直したいところではある。速度向上はマルチスレッドによって次のファイルを事前デコードするようにしようかと思っているが、Unlha32.dllはスレッドセーフじゃないということでうまく出来るかどうか不明。

| | コメント (0) | トラックバック (0)

勉強

昼前に起き出してC#で何かアプリケーションを作ろうと環境作り。こういうのはやろうと思ったときの勢いが大事なわけだし。
Visual Studio.NET 2003は持ってないので、雑誌の付録に付いてきたVisual Studio 2005をインストールしてみる。MSの開発環境はVisual C++ 4.0を使ったのが最後なので、使い方にかなり戸惑う。とりあえず新規ソリューションを作成して、以前から自分好みのものが欲しいと思っていた画像ビュアーを作り始めてみる。
雛形ソースはIDE任せで、ネットから色々と情報を拾い読みして、メイン画面にファイルをD&Dするとそこへ画像を表示するアプリケーションを作ってみた。最初はPictureBoxを使って表示させようとしていたがアスペクト比保持の拡縮が面倒そうだったので、結局メインのFormに直接描画するようにしてみた。まあこんなもんだろうと思うアプリケーションは作れた。あとは欲しい機能を1つ1つ入れていけばいい感じ。他人に使わせるわけでもないので気楽だな。

| | コメント (0) | トラックバック (0)

その他のカテゴリー

Android | C# | Device | DS | PDA | バイク | パソコン | 料理 | 映画