第膚 INI ファイルが使われない ! ? 。 4 「 Windows を最初から再インストールすればいいんでしようけど , いまの環 ☆パステル 境を作り直すのも大変ですからね。なんとかなりませんか ? 」 こういうミステリーは僕に は手に負 ■ワタソン「うーむ。技術的な質問ならともかく , こは , 私立探偵気取りのあいつのところに行こう」 えないな。よし , 「要するに , ホラムズさんに聞きにいくってわけですね ? 」 ☆ / ヾステル ■ワタソン「ぎくっ ! 」 0 Ⅲーファイルが使われない ! ? 「ふむふむ。事情はわかった。ちょっとパステル君のマシンを見てみようじ ▽ホラムス ゃないか。ファイルマネージャを立ち上げて。それから , [ ファイル ] メニュ ーの中から [ アプリケーションとの関連付け ] のコマンドを選んでくれたま 「はい ! やりました」 / ヾステル , ・ホラムズ「じゃ , そこで WST と入力してごらん」 「問題のデータファイルの拡張子だね」 ワタソン 「あ , AKUNO スーパーツールって表示されました ! 」 ☆ / ヾステル ■ワタソン「そんな馬鹿な。 WIN. INI で , ちゃんとワタソンスーパーツールと関連付け してあるのに ! 」
第 8 章 レジストリを解剖する ■ワタソン「確かに , 知識もないのに INI ファイルをいじって , 環境を壊してしまうャッ いってもいいくらいだよ」 こともあるから , あまりにも簡単に書き換えられるのは Windows の欠陥と 危険な存在だよ。うつかり書き換えると二度と立ち上がらなくなってしまう ▽ホラムズ「うっそーじゃないよ。一般のユーザーには , INI ファイルというのは非常に ■ワタソン「うっそー ! 」 てごらん」 必要など , 滅多に出てくるわけがないんだ」 ーが提供している普通の使い方の範囲なら , INI を直接ェデイタで修正する v ホラムズ「役に立っといっても , 意図せざる使い方をする場合の話だろう ? メーカ んだから」 ワタソン「毒されたって ? それはないだろう。実際に INI ファイルの知識は役に立つ いとか , 役に立っとか思い込んでいる連中に」 マホラムズ「ワタソン君も毒されたようだね ? INI ファイルの書き方を知っていると偉 っては Wind 。 ws の再起動が必要だけど」 ワタソン「おいおい , INI ファイルを書き換えれば動作は変わるじゃないか。ものによ 動作を変えられると思っているわけだ」 マホラムズ「いやいや。そうじゃなくて , 君は INI ファイルを変更すれば , Windows の CONTROL. INI も , WIFEMAN. INI も , ほかにもいつばいあるじゃないか」 ■ワタソン「僕はそんなに馬鹿じゃないぞ。 WIN. INI だけじゃなくて , SYSTEM. INI も , ると思っているんじゃないかい ? 」 マホラムズ「もしかして君は , Wind 。 ws というのはなんでも WIN. INI に書けば指定でき 駄目なのに , なんでファイルマネージャで直すとうまくいくんだい ? 」 ■ワタソン「だって , 理屈に合わないじゃないか。工デイタで WIN. INI を書き換えても 、「怨念 ? なんだいそれは ? 」 ■ワタソン「納得がいかないぞ。やつばり , 悪野の怨念が乗り移っていたのかな」 「直ったようだね」 「あ ! ちゃんとワタソンスーパーツールが起動しました ! 」 マホラムズ「じゃあ , ファイルマネージャで拡張子 WST のファイルをダブルクリックし 「修正しました」 ■ワタソン「そんな馬鹿な ! 」 な現象はすべて解消するよ」 ワタソンスーパーツールの実行ファイルを指定する。そして OK を押せば妙 のダイアログで拡張子に WST を入力し , それから < 参照 > ボタンを押して , マホラムズ「まず , この症状の直し方を説明する。関連付けるアプリケーションの設定 マホラムス V ホラムズ ☆ / ヾステル ☆パステル
」・第 8 章 レジストリを解剖する それを起動するから実現できるものだ。つまり , 実行のほかにも拡張子に関 連付けできる項目が増えたんだ。これを管理するのが SHELL. DLL というモ ジュールだ。この SHELL. DLL という Windows3.1 からの新規モジュールカゞ レジストリを使用するように作られているわけだ」 0 設定の衝突 ! ? ■ワタソン「関連付けが SHELL. DLL の機能なのはわかった。でも , WIN. INI に書いた 関連付けの機能も , まだ使えるじゃないか。ワタソンスーパーツールは , WIN. INI にしか設定しないけど動いていたぞ」 「もしかして , どっちに設定しても動作するんですか ? 」 ☆ / ヾステ丿レ マホラムズ「パステル君 , それが正解だ」 「わーい」 ☆ / ヾステル ■ワタソン「ちょっと待ってくれよ。じゃあ , どうして AKUNO. EXE をインストールす る前は動いたのに , そのあとは動かなくなったんだい ? 」 マホラムズ「それは , WIN. INI と REG. DAT の設定が矛盾したからだよ」 ■ワタソン「矛盾って ? 」 マホラムズ「ます , ワタソンスーパーツールを最初にインストールしたときには , REG. DAT 中の WST ファイルに関する設定はなく , WIN. INI に設定されてい るだけだった。だから , WIN. INI の設定に従ってファイルマネージャが動作 していたわけだ ーーに , AKUNO. EXE をインストールした。おそらく悪野 君は , あまり Windows に詳しくないので WIN. INI のことをよく知らす , Windows3.1 の SDK のマニュアルを見ながら AKUNO. EXE を作ったのだろ う。それで , REG. DAT のほうに関連付けを設定するようにしたんだろうね」 「知識がないほうが正しいコードを書けるってこともあるんですね」 ☆ / ヾステ丿レ マホラムズ「そうとも。多少よく知っているからといって慢心していると , ひどい目に あうことがあるからね」 ■ワタソン「ホラムズは最近それで恥をかいたんだよ」 マホラムズ「うん。それがどうかしたかい ? 」 日ワタソン「あっ , ちっとも恥ずかしそうにしてない。ホラムズなんか嫌いだ ! 」 ホラムズ「さて , AKUNO. EXE をインストールした状態では , WIN. INI にも REG. DAT にも , 拡張子 WST のファイルが AKUNO. EXE への関連付けを設定されてい たはずだ。その状態であればとくに矛盾は発生しないね。そのあとパステル 君は AKUNO. EXE を削除したわけだが , 実行ファイルが消えても WIN. INI と REG. DAT の設定は残っている。そして , その状態でワタソンスーパーツ
INI ファイルが使われない ! ? : はいるなあ」 マホラムズ「 INI ファイルをエデイタで書き換えるのは , 本当の最後の手段だと思ったほ うがいいね」 ■ワタソン「わかった。それには同意するよ。でも , それとこの話にどんな関係がある んだい ? 」 マホラムズ「 INI ファイルが Wind 。 ws の動作に対して絶対的な支配権をもっていたのは , Windows3.0 までの時代の話だ」 ■ワタソン「 3.0 までって , それじゃあ INI ファイルのほかにも設定ファイルがあるみた いじゃないか」 ▽ホラムズ「あるよ。だから , Windows3.1 では , システムの情報を記録する手段として の INI ファイルの比重は下がりつつある。 WindowsNT では , INI ファイルは 使われていないんだ」 ■ワタソン「でも , そんなファイルは見たことがないぞ。片っ端から Windows3.1 のファ イルをエデイタで開いてみたことがあるけど , 見つからなかったぞ」 ▽ホラムズ「エデイタでは読めないからさ」 置ワタソン「いったいどのファイルなんだい ? もったいつけないで教えてくれよ」 マホラムズ「レジストリとか , レジストレーションデータベースとか呼ばれているもの だ。ファイル名でいえば REG. DAT だよ」 「それって OLE に関係したファイルじゃないんですか ? 」 ホラムズ「なぜそう思うんだい ? 」 「 OLE でトラブルが起こったときに バックアップしておいた REG. DAT を コピーしたら直ったことがあったから」 マホラムズ「うむ。確かに OLE に関する情報も REG. DAT に記録されているからね。で も , REG. DAT に記録されるのは OLE の情報だけじゃない」 「じゃあ , ほかにどんな情報が記録されているんですか ? 」 マホラムズ「 Windows3.1 の場合は , こう考えるといいだろう。 Windows3.0 との互換性 があるから , 昔からある設定は INI ファイルに書くが , 新しい機能やモジュ ールに関する設定は , REG. DAT に記録するようになっているとね。多少の 例外はあるけれど」 ■ワタソン「ちょっと待ってくれよ。拡張子とアプリケーションとの関連付けは , Windows3.0 からあった機能じゃないか。なんでそれが・・・・・・」 v ホラムズ「確かに拡張子とアプリケーションとの関連付けは Windows3.0 にもあった。 しかし , この機能は Windows3.1 で大幅に拡張されたんだ。例えば , ファイ ルをプリントマネージャにドラッグ & ドロップすると , 印刷が実行される。 これも , ファイルの拡張子から印刷に必要なアプリケーションを割り出して , 8 ☆ / ヾステル / ヾステ丿レ ☆ ☆ / ヾステル
レジストリの構造を ールをインストールした。このインストーラは , WIN. INI は書き換えたけれ ど REG. DAT には手を触れなかった。その結果 , WIN. INI はワタソンスーパ ーツールの設定を含んでいるのに , REG. DAT のほうにはまだ AKUNO. EXE の設定が残っているという矛盾が起こってしまったわけだ」 「そういう状態になっていたんですね」 マホラムズ「そう。こんな矛盾状態のときには , REG. DAT のほうが優先されるんだ」 ■ワタソン「うむむ。そういうわけだったのか。でも , ファイルマネージャで関連付け を設定すると直るというのは , どういうわけだい ? 」 マホラムズ「ファイルマネージャの関連付け設定の機能は , 設定された内容を WIN. INI と REG. DAT の両方に記録する。つまり , 矛盾状態を解消してやるためには , この機能を使ってあらためて設定してやるのがいちばん簡単というわけさ」 ■ワタソン「じゃ , そのレジストリっていうのをプログラムから操作するには , どうし たらいいんだい ? 」 マホラムズ「よしわかった。では , レジストリを扱う API を説明しよう」 ■ワタソン「待ってました」 「わーい。私も聞いていきます」 ☆ / ヾステル ☆ / ヾステル 0 レジストリの構造 りと分離されているけれど , レジストリでは , すべてノードというわけだ」 るわけだ。階層化ディレクトリでは , ディレクトリ名とファイル名がはっき ぞれの要素はノードと呼ばれている。ノードが互いに木構造につながってい 、「まあ , 木構造という点では似ているが , ちょっと違う。木を構成するそれ ■ワタソン「それは , DOS の階層化ディレクトリみたいなものかな ? 」 必要に応じて浅い階層も深い階層も作ることができる」 3 つの階層しかとることができないが , レジストリは木構造になっていて , とることができる。 INI ファイルは , ファイル名 , セクション名 , キー名の レジストリにも構造があるんだ。レジストリのほうがはるかに複雑な構造を マホラムズ「それを , INI ファイルの構造と考えてみてくれ。それと同じような意味で , 中に複数のキーがあって , イコールを挟んでデータの内容が書かれていたよ マホラムズ「 INI ファイルの場合は , 角カッコⅡで区切られたセクションがあって , その ■ワタソン「構造があるのかい ? 」 ホラムズ「では , まず最初にレジストリの構造を説明しよう」 マホラムス ■ワタソン「ああ」 8
リンカの DEF ファイルとは 2 ノ多 0 リンカの DEF ファイルとは 問題なのは , SEGMENTS キーワードや CODE キーワード , そして DATA キ DEF ファイルに書かねばならないことは滅多にないだろう。すると , IMPORT はインポートライプラリをリンクすればすむ。普通のシンポルを EXPORT は関数を宣言するときに _export キーワードをつければいいし , ホラムズ「それから , EXPORT と IMPORT に関する指定も事実上必要ないんだ。 ■ワタソン「うん , それはわかる」 にはいかない要素だし , 別に問題はないと思う」 に DESCRIPTION によるプログラムタイトルの指定。これらは書かないわけ れから HEAPSIZE キーワードによるローカルヒープのサイズの初期値の指定 ーションの指定と STACKSIZE キーワードによるスタックサイズの指定 , そ ▽ホラムズ「もっとも基本的な指定は , EXETYPE キーワードによる Windows アプリケ 表 1 メモリのオプション リストアップすると , こんな感じかな ( 表 1) 」 マホラムズ「じゃあ , 詳しく説明するとしよう。セグメントに設定できるキーワードを ■ワタソン「そうそう。そこらへんがよくわからないんだ」 ーワードだろうね」 DISCARDABLE または NONDISCARDABLE 指定できるキーワード ■ワタソン「え ? こんなにいつばいあったの ? 」 セグメント共有 読み出しのみ 移動可能 読み込むタイミング インスタンス 実行のみ 破棄可能 目的 SHARED または NONSHARED READONLY または READWRITE MOVAB LE または FIXED PRELOAD または LOADONCALL NONE または SINGLE または MULTIPLE EXECUTEONLY または EXECUTEREAD マホラムズ「これは Visu C + + 1.5 の B 。。 ksO ⅲ ine から引いたものだから , は利用できるオプションはもっと少ないかもしれない」 ■ワタソン「あ , ああ。わかった」 「まず , 最初の破棄可能というのはわかるよね」 マホラムズ 古いリンカで ■ワタソン「ああ。 DISCARDABLE を指定すると , メモリが足りなくなったときに自動 的に破棄されるんだ」 15
第 5 章 ワタソンの呪われた赤い文字 ・リスト 1 プリンタへのテパイスコンテキストの取得方法 (Windows3.0 SDK の PRNT 日 LE サンプルプログラムより ) HANDLE GetPrinterDC() char pPrintInfo[80]; LPSTR lpTemp : LPSTR lpPrintType; LPSTR IpPrintDriver; LPSTR lpPrintPort; if (!GetProfiIeString("windows" return (NULL) ; pPrintInfo; 1 pTemp IpPrintType lpPrintDriver IpPrintPort while (*IpTemp) ー if (*lpTemp = * lpTemp + + while (*IpTemp lpTemp = AnsiNext(lpTemp) ; if (!lpPrintDriver) lpPrintDriver IpPrintPort break; (LPSTR) ” l)evice' pprintlnfo, 80 ) ) 1 pTemp ; e I se ー 1 pTemp ; e 1 se lpTemp = AnsiNext ( lpTemp) : return (CreateDC(IpPrintDriver, lpPrintType, IpPrintPort, (LPSTR) NULL)) ; ☆パステル「あ , 見たことがあります。 WIN. INI の先頭のほうの , 確かデフォルトのプ リンタの指定ですね」 マホラムズ「 3 つの名前が『 , 』で区切られていて , 最初はプリンタそのものの名前 , 2 番 目はプリンタドライバのファイル名 , 最後は出力先のポート名だね」 ☆パステル「はい , そうですね」 マホラムズ「これは , CreateDC の最初の 3 つの引数に , そのまま渡せるような文字列に なっているんだ。つまり CreateDC の最初の 3 つの引数は , それぞれプリンタ ドライバのファイル名 , プリンタそのものの名前 , 出力先のポート名なんだ。 順番は違っているけれど , それぞれの文字列をそのまま渡せるわけだ」 ☆パステル「最後の引数は NULL になってますけど」 ホラムズ「これは , 用紙やそのほかの設定をプリンタドライバに渡したいときに使う ものだが , コントロールバネルで設定した用紙など , ほかと同じ設定で印字 したい場合は NULL でかまわない」 ☆パステル「あ , ちょっと待ってください。 WIN. INI の DEVICE = って , コントロール
・リスト 1 登録工テイタで設定するテキストファイルの例 REGEDIT HKEY_CLASSES_ROOTY. bmp HKEY_CLASSES_ROOTY. msp HKEY_CLASSES ROOT \. pcx pbrush. exe HKEY_CLASSES_R00TYPBrush ペイントプラシ PBrush PBrush PBrush HKEY CLASSES R00TYPBrushYshellYprintYcommand= HKEY_CLASSES_R00TYPBrushYshe llYopenYcommand レジストリ API 、 pbrush. exe /P % 1 pbrush. exe % 1 HKEY CLASSES R00TYPBrushYprotoco 1 YStdFi I eEd i t i ngYverbY0 HKEY_CLASSES_R00TYPBrushYprotocoIYStdFi 1 eEd i t i ngYserver 編集 ■ワタソン「なるほど。でも , だね」 マホラムズ「そうだ。だから , それを説明しよう」 ■ワタソン「よしきた」 ダイナミックに設定内容を変えたいようなときには不便 これをちゃんときめ細かく扱うための A 円もあるから , ▽ホラムズ「まず , この API はプロファイル関係の API, つまり INI ファイルを扱う API には似ていない。扱い方がだいぶ異なるんだ」 ■ワタソン「というと , つまり WriteProfileString のような WriteRegistryString というの がないってこと ? 」 マホラムズ「そう。基本的に 1 対 1 で対応するような API はない。そこで , プロファイル 関係の API との違いをあげて , 説明することにしよう。まず最初に , レジス トリを扱ううえで気にとめなくてはならないのはヘッダファイルだな」 0 ワタソン「ヘッダファイルがどうかしたのかい ? 」 マホラムズ「プロファイル関係の API は WINDOWS. H に書かれているね。しかし , レジ ストリのほうは SHELLAPI. H に書かれている。プロファイル関係の API が Kernel に入っているのに対し , これらは SHELL. DLL に入っているという違 いが , ヘッダファイルの区別にまで及んでいるというわけさ」 ワタソン「ふむふむ。使うときには , WINDOWS. H だけでなく SHELLAPI. H もインク ルードしておく必要があるってことだね」 マホラムズ「そして 2 つ目の違いは , 1 個の API を呼び出すだけではデータが書けないっ てことだ。例えば WIN. INI に書きたいときには , writeprofilestring を呼び 出すだけで , ひとつのキーとデータを書くことができた。ところがレジスト リのほうは , キーをオープンして , データを読み書きして , それからクロー マホラムズ「いや , ちょっと待ってくれ。これは非常に意味深いことなんだよ。プロフ ■ワタソン「なんだか面倒だね」 ズしなければならない仕組みになっているんだ」 8
第 8 章 レジストリを解剖する 「木構造という点では似ているか : ちょっと違う丿 ■ワタソン「そのノードっていうのはなんだい ? 」 マホラムズ「ノードは , キー名とその内容となる文字列のペアで構成される」 要ワタソン「 INI ファイルの 1 行みたいなものだね」 ▽ホラムズ「いや , それに似ているけれど , ノードはさらにその下に階層をもっことが できるから , もっと強力なものだよ」 ■ワタソン「うむむ。なんかややこしくなってきたぞ」 マホラムズ「よし , それじゃあ , 本物のレジストリを見て , イメージをつかんでみよう」 ■ワタソン「おいおい。テキストデータではないんだろう ? 16 進ダンプでも見るのか V ホラムズ「パステル君。ちょっと , REGEDIT. EXE を立ち上げてくれたまえ。プログ ラムマネージャのファイル実行ダイアログから , regedit /v リターンと入力 してごらん」 「はい , 実行しました ( 図 1) 」 ☆ / ヾステル ■ワタソン「こんなの初めて見たぞ。パステル , どこで見つけたプログラムなんだい ? 」 「私 , インストールした記憶ないんですけど」 ☆ / ヾステル v ホラムズ「なに , Wind 。 ws3.1 に標準で入っているプログラムさ」 ■ワタソン「思い出したぞ。 1 回起動したけど使い方がわからなかったんだ。でも , こん な画面だったかな」 ・「 /v をつけて起動したからね。これがレジストリを自由に操作できる管理者 マホラムス
第 8 章 レジストリを解剖する 住ワタソン「むむ。それは , 大胆な挑戦だな」 の上位互換ソフトを作ったんです」 「実は悪野君が , ワタソン先輩に勝つ ! といってワタソンスー ■ワタソン「どういうことか説明してくれるかい ? 」 ーパーツールが起動しなくなったんです」 ソンスーパーツールのデータファイルをダブルクリックしても , ☆パステル ☆ / ヾステ丿レ ☆ノヾステ丿レ ☆ / ヾステル ☆ノヾステル ☆ / ヾステル ☆ノヾステル ワタソンス ノヾーツール 「それで , 私のパソコンに無理やりそれをインストールしていったんです。 そのときに , もうワタソンのツールには絶対に戻れないぞ , なんていってま ■ワタソン「なんてャツだ。でも , そんなにすごいソフトだったのかい ? 」 「機能は豊富なんですけど , 操作性は悪いしバグが多くてちゃんと動かない んです」 ■ワタソン「なんだ , そうか。ちょっとホッとしたな」 「問題は , そのあとなんです。悪野君のソフトを消して , もう一度ワタソン スーパーツールをインストールしたら , 困った現象が起こったんです」 ■ワタソン「どんな現象だい ? 」 「ワタソンスーパーツールの拡張子 WST のデータファイルをファイルマネー ジャでダブルクリックしても , 消したはずの悪野君のプログラムが見つから ないっていうエラーになるんです」 ■ワタソン「再インストールするとき , ちゃんとワタソンスーパーツールの SETUP. EXE を実行したかい ? 」 「はい。もちろんです」 ■ワタソン「おかしいな。 SETUP. EXE で , WIN. INI に関連付けを設定しているんだけど なあ」 「それも確認しました。ちゃんと WIN. IN I の [ Exten s ion s ] に『 w st = wstool.exe ^. wst 』という行が入っています。なのに , ファイルマネージャか ら WST ファイルをダブルクリックすると , ワタソン先輩の WSTOOL. EXE じゃなくて , 消したはずの AKUNO. EXE が立ち上がろうとするんです。っ いでにいうと , そのダイアログで < 位置 > というボタンを押すとディレクト リを選択できるんですけど , そこで , EXE ファイルの名前は書き換えられな いんです。だから , 無理やりワタソンスーパーツールを起動することもでき いったい , どうなっているんですか ? 」 ないし・・ ■ワタソン「え ? え ? なんでだろう。おかしいなあ。まさかャツの怨念がパステル のマシンに乗り移って・・・・・・」