先週一週間はちょっと出張に行ってました。一週間になると、なかなか体力的にきついのか、すぐに帰りたくなるという、今までにない展開でした。それでも、出張先のみなさんにはほんといろいろケアしてもらいまして、楽しい日々を過ごすことができました。
が、最後の最後、東京へ戻るときに、大雨で新幹線が止まるというトラブルが。結局、二時間ほど新大阪で足止め、東京駅に着く頃には日付が変わって夜中の 1 時と。いやー、疲れました。
そんな一週間ですが、ちゃっかりと SSD を注文したりなんかしてまして。Crucial の M4 です。512 メガあれば、x64 でもなんとかいけるだろうと。というわけで、今日は Windows 7 のインストールをやってました。夕方からはじめて、アプリの移行やら何やらでほぼ完了した感じです。あとは細かい設定変更とかその辺ですかね。おいおいとやっていこうと思います。
.NET Framework では、いろんなコントロールが標準で装備されていまして。で、足らなければ、サードパーティ製のコンポーネントを利用したり、既存のコントロールを継承したりと、いくつかの対処方法があります。
サードパーティ製のコンポーネントは費用面よりも、メンテナンスまわりの問題 ( 何かあったときに手を入れる、ってわけにいかないのが難点。サポートのいいベンダーじゃないと、怖くて使ってられません ) があるわけで、おのずと自作で何とか、って方向に行きがちです。
そんなとき、一からコントロールを作るのはえらい大変なので、『何か手抜きできるところがないか?』と思ってたんですが、やっぱりあるわけですね。スタイル変更くらいにしか使ってなかった CreateParams プロパティですが、ここでクラス名を指定してあげると、Windows に用意されているコントロール が作れるわけです。
微妙な例ですが、こんな感じ。
class IPAddress : System.Windows.Forms.TextBox { [DllImport("comctl32.dll", EntryPoint="InitCommonControlsEx", SetLastError=true)] static extern bool InitCommonControlsEx( ref INITCOMMONCONTROLSEX iccex); [StructLayout(LayoutKind.Sequential)] public struct INITCOMMONCONTROLSEX { public int dwSize; public uint dwICC; } const uint ICC_INTERNET_CLASSES = 0x00000800; protected override CreateParams CreateParams { get { CreateParams cr; INITCOMMONCONTROLSEX icc; bool result; icc = new INITCOMMONCONTROLSEX(); icc.dwSize = Marshal.SizeOf(icc); icc.dwICC = 0x00000800; cr = base.CreateParams; result = InitCommonControlsEx(ref icc); if (result) { cr.ClassName = "SysIPAddress32"; } return cr; } } }
この例では、テキストボックスを継承したクラスを実装していますが、クラス名として IP Address コントロールを示す『SysIPAddress32』を指定しています。環境によっては InitCommonControlEx() 関数を呼び出す必要があるみたいですが、こんな感じでさくっと。
ただし、キー入力の処理とかまでは面倒を見てくれないようで、フィールド ( IP アドレスのオクテット ) 間の移動とかは、自分で処理を追加しないとダメみたいです。
自宅のインターネット接続がなんだか調子が悪く、微妙な状態が続いてます。昨日、電子レンジを使っていたらブレーカーが落ちまして。それ以来、なんだかつながったりつながらなかったりが続いてます。
とりあえずルーターまでは問題ないようで、その先も、『まったくつながらない』という状態ではなく、DNS が引けなかったりタイムアウトしたり。5 〜 15 分くらいの間隔で接続できない時間が来るような感じです。
ちょこまかリトライを繰り返せば何とかレスポンスは受け取れるんですが、非常に精神衛生上良くない感じ。できることといえば、ルーターのリセットくらいなんで、ちょっと手の打ちようがないです。困った困った。
今さらではあるんですが、タイプライブラリを用意しないといけないお仕事がありました。Windows が提供しているインターフェイス群、たとえば、IShellLink みたいなやつは、.idl が用意されていて、midl.exe でコンパイルすればさくっと .tlb が生成されます ( ShObjIdl.idl から、ほかにもたくさんインターフェイスが含まれたやつができます )。
が、そういうやつばかりではなくて、.idl が用意されていても .tlb が生成できないやつもあったりします。今回のもまさにそれで、.c とか .h しかできませんでした。こういうときは、.idl に library 指定がないとか、何かしかの理由によるものです。
というわけで、library 指定を入れて、ついでに coclass の指定を追加して、なんとかできました。Excel VBA で読み込んでみるとなぜか「サポートされてないうんぬん」と言われるので、引数の DWORD を long に変更して、と。この辺、すっかり忘れてます。というか、midl.exe じゃなくて、mktyplib.exe を使ってたような記憶も。
たいていの場合、C++ で作ってしまう ( ラッパーにすることも多し ) ので、タイプライブラリを作るまではなかなかやる機会がありません。.NET Framework であれば、COM Import したクラスにしちゃえばいいですし。
Visual Basic 6.0 のサポートが終了して久しく、タイプライブラリが必要になるケースもそれほど多くはありませんが、まだ Excel やらの VBA で生き残ってる部分もあったりするので、なかなか捨て去ることができないのが悩ましいです。
インストールしているオペレーティングシステムが 32 ビットなので、まったく意味ないわけですが、Thinkpad W500 のメモリを増設して 8 G バイトにしました。4 G バイト分の RAM Disk でも作るのがいいんですかね。ちょっと考えようと思います。
今のメイン環境では、SSD の 256 G バイトのやつが C: ドライブなわけですが、64 ビット環境だとちょっと足りない感じなので、その辺を増強したら 64 ビット環境に移行しようかと思ってます。Intel の 600 G バイトの SSD か、今も使っている Crucial の 512 G バイトのやつあたりを検討中。でも、Intel のやつは『Intel SSD 320に「容量8MB」になる不具合、インテルも認識』なんてのがあるようで、ちょっとどうしようかと。
9.5 mm でテラクラスの HDD も、Samsung、Western Digital に続き、東芝 からも出てきてますし、ちょっと環境周りの見直しでお金がかかりそうです。
今日は先月受けてきた基本情報技術者試験の 結果発表 だったんですが、『ミスがなければ受かってるんじゃないか?』という予言どおり、ミスをしてたみたいでした。はい。不合格です。
成績欄を見てみると、午前は 80% 取れてて、午後はすべて『-』と。これって、受験番号間違いとかでしょうか...。ほんとお恥ずかしいです。恥ずかしいのでわざわざ書きたくはなかったんですが、『受けた』と書いた手前、その結果を書かないわけにも行かず。
さっそく申し込んだので、秋にリベンジできるように頑張ります!