OPENFILENAME は古い

C# ばかりやっていたら頭が腐りそうなので今日は慣れた C++ を。

今回は Cinema にリストアップ拡張子選択機能を付けて更新しようと考えた。
ついでに開くダイアログを改造していたのであるが…

OPENFILENAME 構造体に lpfnHook を指定したら古いダイアログになっちまった。
なんでじゃい!

CFileDialog::m_ofn

なんてこった、GetOpenFileName 関数はこんなに変わっていたのか。
このサポートされなくなったメンバを使わなければコンパイル時に新しいのに置き換えられる。
ということみたい。

ExpLZH の保存ダイアログが古いのとかが気になっていたのだがそういうことだったか。
でも秀丸とかはカスタマイズしているのに Vista スタイルになっているよな?
何か方法があるのだろう、調べてみよう。

で。

どうやら Vista 型式のダイアログは COM の IFileDialog を使うようである。
何故 COM なんだ?と文句を書いてもしゃーないので作るしかない。

MSDN じゃ全然解らない!サンプルにも見あたらない!
日本語で探しても解りにくいので「ウエブ全体」でググる。

CodeProject: Vista Goodies in C++: Using the New Vista File Dialogs. Free source code and programming help

流石に老舗のココは解りやすい。
CComPtr なので ATL での解説だけどなんとかなるだろうと書いてみる。

何故だろう?
SHCreateItemFromParsingName の引数がどこを探しても3つなんですけど…
私の Visual Studio では4つあるんですけど、デフォルト引数でもないし…

あぁ更に解らない!ということで更新は又今度。

C# で UTF-8 の INI

さて、STL で作った IniFile8 クラスを C# で作り替えているんだが。

C#のジェネリック -OKWave

ココとかを参考に std::pair 互換クラスを作ろうかとも。
でも今はよくワカンネ、別の方法で実装できるならそれでいいし。

意地でも同じ方法を行いたいのではなく「こういう処理がしたい」なので。
この言語にて最適な方法を探ったほうが強引に同じにするより自然だろうと。

StreamWriter クラス (System.IO)

んー、BOM は強制的に書き込まれてしまうということなんですね。
別に変換して ASCII で書き込むという方法もあるけどまあいいか。

文字列がnull(Nothing)か空文字列かを簡単に判定するには?[2.0のみ、C#、VB] ? @IT

うっ!そういえばそうだ、考えていなかった。
IniFile8 STL 版は空文字チェックなんてしていない。

C# でキーが見つからない場合は関数で null を返すようにしてテスト。
どうやらそういう使い方だけなら null チェックだけで済みそうだ。

C++ は試しに Cinema の設定で「リストアップ拡張子」を空にしてみる。
再起動すると…あぁやっぱり初期値の復活だ。

if ( (s.empty()) && (0 != s.length()) )

でチェックすればいいかな?
しかし C# のコードを探して C++ 版の不具合を見つけるとはなんとも。
やはり色々なアプリを平行して作るとイイことあるよ。

ということで。

UTF-8 の ini 読み書き

というコードがなんとかできた。

using IniFile

/* 略 */

private void Window_Closed(object sender, EventArgs e)
{
    IniFile8 ini = new IniFile8(@"D:\\00_Temp\\test.ini");
    ini.WriteInteger("Window", "Left", (int)this.Left);
    ini.WriteInteger("Window", "Top", (int)this.Top);
    ini.WriteString("Window", "Title", this.Title);
    ini.Save();
}

みたいなコードで使える。

Ubuntu で C# と C++

まてよ、mono の実行エンジンはインストールされているのかな?
とりあえず Vista でコンソールアプリを作り Ubuntu に持って行って実行してみる。
java じゃないんだからコンソールでないと動くはずがない。

まあ結果は動く、軽く調べるとどうやら実行エンジンは標準搭載らしい。
標準状態では C 言語さえコンパイルできないんだから C# は当然ムリか。

Mono 1.9.1のインストール – Programming/Mono – 総武ソフトウェア推進所

なんかイッパイ入れなきゃいけないみたいですけど…
そういえば Visual Studio 2008 のインストールは二時間掛かったっけか。
たった二分でインストールできた mono Develop で同等なわけがない。

特に Linux の場合 GUI アプリは gtk+ か Qt とか様々なわけで。
Windows 版のようにまとめて一気にインストールはそりゃ無謀かと納得。

2008-02-03 – ままならない日記

とりあえず mono-gmcs だけをインストール。
結果はコンパイルできた、よしよし、後は気が向いたら(ぉい!)

ちなみに、コード補完は C# でしかやってくれない。
思わず Ctrl+Space を押して SCIM を…略。

それより知らなかったのだがソースコードは UTF-8 で保存されるんだね。
ローケルのとうりになるのか、こりゃ日本語の扱いが更に面倒そう。
だけどコードページ 932 (つまり Shift-JIS)の呪縛が無いのは嬉しいね。

ということは…

やはり search.ini なんかも普通に char 配列で読み書きできるわな。
Firefox も Opera も設定が全部 UTF-8 なわけだよ、よく解った。
Windows も…バイナリ配布が普通の Windows では無理だと解っているけど。

C# テストが目的だったけど C++ コンパイラとして使うのも悪くないなコレ。
続く…かもしれない。

Ubuntu で C#

ふと気がついた。
C# を勉強しているんだから Ubuntu に Main Page – MonoDevelop を入れてみよう。
Linux ではどう動くか見てみたい。

Vista じゃないから遅いと思うけど…JAVA も死ぬほど遅いし。

一応書くと .NET Framuwork 技術基盤 CLI の Linux 実装の一つである。
追加と削除(Synaptic)に普通にあるのが怖い。

普通に日本語化されとりました、恐るべし。

あれ?C++ もコンパイルできるのだろうか。
試してみよう、VS と同じようにソリューションを作って雛形をとりあえず。

んでもってコンパイル…エラー。
何一つ詳細が出ない、VC++ のワケワカなのもイヤだが全く出ないのもどうかと。

Ubuntu日本語フォーラム / gccやbinutils, make のインストール

つまり Ubuntu デスクトップにははコンパイラもヘッダも入っていないってわけ…
make install の儀式をやらなくなったので気がつかなかった…
まあ気を取り直して…追加と削除に無いんですけど…

$ sudo apt-get install build-essential

と勘(ぅぉい!)でやってみたら普通にインストール完了。
見事 C/C++ はコンパイルできるようになりました。

普通に C/C++ 用の IDE としても使えるみたい、これは嬉しい。
何故もっと有名にならないの?

Linux のコンパイルは端末というイメージがあったので今まで無視していた。
だけどこんな使える IDE があるのなら少しやってみようかなと感じた。
Eclipse でできるのは知っているけど…遅いもん。

いよいよ肝心な C#。

今度は gmcs とやらが無いんかい…次回へ続く。

UNICODE にならん

pinvoke.net: StrCmpLogicalW (shlwapi)

むむっそうか、やっと自然順ソートで無限ループしてしまう問題が解決。

//[DllImport("shlwapi.dll")]  だけでは無限ループ
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]

ココが問題だったとは…なんつー解りにくい仕様。
C# 内部コードは UNICODE だから勝手に UNICODE で渡ると思い込んではダメだね。

やっとリストビュー部分の見た目だけが完成、ここまで長かったぞ!
ツリービューとアドレスバーで更に苦しみそうな気配。

Google のコードサーチで StringLogicalComparer なんてのも見つけたけどね。
C# コードのみで実装できるから魅力的なのであるが、こっちだと何故か順番が違う。

それにライセンスもイマイチ不明瞭だし、他人のコードを使うのは怖いというのもある。
今後ソースコードはすべてライセンス放棄で公開すると決めているのだから。

後 STL で作った IniFile8 クラスの C# 化もやっているんだが…
typedef の代わりは using で可能とかは検索では見つかったんだけーが…
コレでは型名として使えないようでインテリセンスに怒られまくり、まいった。

あぁ、ほとんど進まないまま連休が終わってしまった。
きっと Ubuntu が悪いんだ、又しても禁 Linux しなきゃいけないか?
でもブログアクセスのほとんどが Ubuntu ネタという現実はなんとも。

いっそ Ubuntu + Python + Qt とかに早めに移行したほうがよさげかも。
Palepoli が一段落したらやるつもりだったんだが…いつになるやら。