ーン一ノーエ 第 14 章 A 円スへシャル・ Windows 誘拐事件 行うと , これとつながるわけだ。そのあとは普通のファイルのリードやライトの A 円で きパイプが用意されているなら , 料 akaneYpipeYsamp 厄という名前でファイルオープンを ファイル出力とを結合できる。例えば , サーバ—akane で , sample という名前の名前付 をつけられるパイプなんだ。その名前を指定することで , 任意のファイル入力と , 任意の 「似たようなものだといえるね。でも , 名前付きパイプとは , プログラマが自分で名前 「名前付きパイプ ? MS - DOS のパイプの親戚かい ? 」と僕は首をかしげた。 「それから , 簡単さでいえば , 名前付きパイプというのもあるね」 「そうだ」ホラムズはうなずいた。「そのほかに , RPC というものもある。 「なるほど。ファイル入出力の API がそのまま通信に使えるわけか」 ン B のファイル入力 API の入力データになるわけだ」 「つまりね , マシン A からファイル出力した内容がファイルに入るのではなく , 「それってどういう意味 ? 」僕はピンとこないので質問した。 通信することができる」 これは , マシ socket インタフェースに接続するためのものさ。 UNIX 系のアプリケーションを移植する 「あと , socket というインタフェースもあるよ。これは , UNIX でよく使われている 「そんなものもあるんだね」僕は納得してうなずいた。 あるが , それほど難しくはないよ」 いくわけだね。そのためには , 飛ばすデータを MIDL という言語で定義してやる必要が A にある関数を呼べるようになる。引数やリターン値が , ネットワークを経由して飛んで とするね。こういうときに , マシン B で実行するプログラム上で Test() と書けば , マシン 例えば , マシン A に Test という名前の関数があって , これをマシン B から呼び出したい Remote procedure Ca Ⅱの略で , 離れたマシンに用意されている関数を呼び出す仕組みだ。 「そうです。マリリンさん」ホラムズはうなずいた。 クライアント側に , それぞれのプログラムが必要なんでしよう ? 」 「あの , ホラムズさん ? 」マリリンさんがいった。「でもそのためには , サーバー側と 上で通信するプログラムが容易に作れるわけだ」 「このように , NT にはいろいろな通信 API が備わっていて , それを利用すれば , 「ふむふむ」 場合や , UNIX 系アプリケーションと通信する場合には便利だね」 LAN か ? ファイルマネージャでファイルを選択して , [ セキュリティ ] メニューの [ ファイル 監査という機能を使えます。ちょっと管理者権限でログオンしてみてください。いいです 「では調べてみましよう」ホラムズはいった。「 NT の場合 , NTFS 上のファイルなら , リンさんはロごもった。 ムをインストールしなければなりません。それは不可能ですから , その推理は・・・・・・」マリ 「だとすれば , 私のマシンの中の電子メールを覗くには , このマシンになにかプログラ
プリンタの能力を調べる学色 ) HDC CreateDC( LPCSTR 1pszDriver, / / ドライバの名前 LPCSTR 1pgzDevice, / / デバイスの名前 LPCSTR 1pszOutput / / ファイルまたはポート名 CO れ 8 セマ 0 土 d FAR* 1pvInitData / / 初期化データ 図 4 デバイスコンテキストを作る 「じゃあ , この API でウインドウに描くときにはどうしたらいいんですか ? 」 マホラムズ「この API で表示用の hDC を作成する場合は , ドライバの名前を DISPLAY とする。 DISPLAY というのはディスプレイドライバのモジュール名だ。デ イスプレイドライバにはいろいろなファイル名のものがあるが , プログラム から見れば , ディスプレイドライバの名前はすべて DISPLAY だ。だからい つでもこの名前を使ってかまわない。そうやってこの API で作成したデバイ スコンテキストは , 画面全体に対するコンテキストになる。ウインドウなど というものはすべて無視されて , どこにでも描画できてしまう」 「それはすごいですね ! 」 ホラムズ「面倒なだけさ。画面全体に描きたければ枠のない最大サイズのウインドウ を作ればいいじゃないか。一部だけ描画したいとき , システムがウインドウ のサイズに応じて , クリッピングをしてくれないのは非常に面倒だ。だから , そんな機能は誰も使わない」 「使わないのなら , なんでこんな A 円があるんですか ? 」 v ホラムズ「表示用に使わなくても印字用に使うからさ」 「あ , そうですね。いまは印字の方法を説明してくれているんでしたね」 ■ワタソン「はい , 質問 ! 」 「ワ , ワ , ワ , ワタソン先輩 , いつの間に ! ? 」 ■ワタソン「僕をのけ者にして , 面白そうな話をしているじゃないか。ところでさ , い まの説明って画面とプリンタの話だけじゃない。メモリビットマップに描画 したいときはどうなるんだい ? 」 マホラムズ「ふむ。確かに , メモリ上にビットマップを確保して , これに描画すること もあるね」 「じゃあ , メモリビットマップ用のデバイスドライバがあるんですか ? 」 マホラムズ「いや , そうじゃない。メモリビットマップは , ディスプレイドライバが処 ☆パステル ☆ / ヾステル ☆ / ヾステル ☆ノヾステル ☆ / ヾステル / ヾステ丿レ ☆
セグメントの種類と名前をク / た。これがセグメントのリストか。ずいぶんたくさんあるなあ ( リスト I) 」 ほうら , でき ■ワタソン「それならすぐにできるよ。プロジェクトを開いてビルド ! ・リスト 1 Generic の MA P ファイル ( スモールモデル ) GenerlC Start 0001 : 0000 0002 : 0000 0002 : 0010 0002 : 00E6 0002 : 00F4 ( 中略 ) 0002 : 00F4 0002 : 00F4 0002 : 00F4 0 圓 2 : OOFC 0002 : 0242 0002 : 0244 0002 : 0246 ( 中略 ) 0002 : 0250 OriginGroup 0002 : ODGROUP Length 00A22H 圓 OIOH 000D6H OOOOEH 00000H 00000H 00000H 00008H 00146H 00002H 00001H 00000H 00002H Name TEXT NULL DATA CDATA XIFB DBDATA CONST HDR MSG PAD EPAD BSS Class CODE BE GDATA DATA DATA DATA DATA CONST MSG MSG MSG MSG BSS c_common BSS マホラムズ「 Name の下に書かれた名前がセグメントの名前だ。 コードセグメントで , 残りはデータセグメントだね」 こでは一 TEXT だけが ■ワタソン「どうしてこんなにたくさんのセグメントがあるの ? Generic のソースに は , なにも書かれていなかったと思うけど」 マホラムズ「コンパイラの内部目的で作られるセグメントも多いんだ。リストをよく見 てごらん。 Length がゼロになっているものが結構あるだろう ? これは , 単 に名前が定義されているだけで中身はない」 ■ワタソン「へえ。ところで , BSS ってなに ? 」 クラスが DATA ならまとめられてデータセグメントになったりする」 マホラムズ「セグメントの使用目的を識別するキーワードといったところかな。例えば , ▽ホラムズ「ここでクラスにも注目してみよう」 ■ワタソン「あ , ほんとだ」 ■ワタソン「クラス ? 」 ▽ホラムス 「初期化データを含まないデータとでもいえばいいのかな。初期値がゼロの 変数などはここに集められるんだ。クラスが DATA のセグメントと一緒にグ トに割り当てられるのさ。しかし , リンカではクラス DATA とクラス BSS は 階には , この Dgroup がデフォルトのデータセグメントという 1 個のセグメン ループ化されて , DGroup というグループになる。そしていざ実行される段
第 1 章 Windows の勝手口 コラム OWindows95 ってなに ? ワタソン「ねえ , ホラムズ。 Wind 。 ws95 って名前を最近聞くけど , いったいなんなん マホラムズ「 Chicago という名前でさんざんマスコミで報道されてきた , Windows3.1 の 後継 OS のことさ」 ■ワタソン「なんだか頻繁に名前が変わるのって困るな」 ホラムズ「 Chicago は開発コード名 , Wind 。 ws95 は商品名さ。これ以上はもう変わら ないよ」 ■ワタソン「なんだ , そうなのか。しかし Wind 。 ws3.1 の後継なら , どうして Windows 3.2 とか Windows4.0 にしなかったのかな」 ホラムズ「 Windows も世界中でたくさんの人に使われているからね。その中にはパソ コンの素人だって多い。単にパソコンを買ったら , Windows がプレインスト ールされていたというケースだって多いんだぞ。そういうお客さんには , バ ージョン番号ではどれが最新の Wind 。 ws が区別がつかないという調査結果 が出たそうだ」 ■ワタソン「それって , すごい素人だね」 ホラムズ「それほど Wind 。 ws が使われているってことなのさ。だから , 誰にでも最新 の Windows を区別できるように , 95 という西暦の下 2 桁の数字をつけるこ とになったらしいよ」 ■ワタソン「へえ , そうだったのか。それじゃ , この先ソフトのバージョンはみんな , 96 とか 97 とか 98 になるのかな」 、ホラムズ「いや , 全部がそうなるわけじゃないだろうけどね」 ■ワタソン「ところで , 1998 年に出る Windows は , やつばり Windows98 なんだろうか」 ■ワタソン「そうしたら , 98 ユーザーが間違えて買っていったりしてね」 マホラムズ「 ? 」
第 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 = って , コントロール
パネルで設定されるんですよね。 「そのとおり」 「あ , わかりました ! つまり , デバイスコンテキストの作り方を , 色丿 プリンタを選べば」 このサンプルソースの関数を実行すれば , マホラムズ ☆ / ヾステル ☆ / ヾステル ☆ / ヾステ丿レ ☆ / ヾステル ☆ / ヾステル ☆ / ヾステル ☆ノヾステル マホラムス ☆ / ヾステル プリンタドライバはコントロールバネルで通常使うプリンタに設定したまま で , そのコントロールバネルの設定どおりに印字するデバイスコンテキスト が作られるわけですね ! ? 」 マホラムズ「うん , そうだよ。よく見るとわかるとおり , WIN. INI から文字列をとって くるのと CreateDC でデバイスコンテキストを作るのを除けば , やっている ことは『 , 』区切りの文字列をバラバラに分解しているだけだからね。難しく ないだろう ? 」 「最初に思っていたよりは簡単ですね。でも , 質問があります」 マホラムズ「なんだい ? 」 「どうして , プリンタドライバの名前と , プリンタの名前の両方を渡す必要 があるんですか ? 」 ▽ホラムズ「うん。それはいい質問だね。考えてみたまえ。世の中には , ものすごくた くさんの種類のプリンタが存在しているだろう ? 」 「そうですね」 マホラムズ「ほとんど数え切れないくらいの機種が世に送り出されてきたからね。でも 同じシリーズのプリンタなら , 機能やコマンドやページ記述の方法はよく似 ていることが多いから , 少しの差を別にすればほとんど同じプリンタドライ バでかまわないわけだ」 「あ , そうですね。 ESC/P とか PostScript とか , そういうのがありますね」 マホラムズ「だから , 似ているプリンタはひとつのプリンタドライバで扱うことが多い んだ」 「でも , 似ているといっても少しずつ機能が違うんですよね」 ホラムズ「そうだ。それに対応するためにプリンタの機種名も引数で渡すようになっ ているんだ。例えば , 内容は同じで , 内蔵されているフォントの数が違うだ けのプリンタが 2 台あったとしよう。 こういう場合 , プリンタドライバは自 分に渡されるプリンタの機種名を認識して , フォントがいくつ使えるのかを 自動的に判別することができるわけだ」 「あ , なるほど。そういうことですか」 「例えば , ほら , 日本語 Windows の CONTROL. INF ファイルを見るとよくわ かるよ。ひとつの EPSON_J. DRV というプリンタドライバで , 実に 1 8 機種 もカバーしているから」 「あ , ほんとだ。すごいですね」
フ第 4 章 この コモンダイアログを盜め ! グのデザインを使おうとするから利用できませんよね。かといって , コモン ったとしても , コモンダイアログは COMMDLG. DLL に入っているダイアロ 「なるほど , そうですね。でも , こうやって別にダイアログのデザインを作 は , 元々ある機能のうちの一部を隠すような使い方も考えられるわけだ」 ように強制するようなアプリケーションがあるかもしれない。そういう場合 マホラムズ「そうさ。利用目的によっては特定のディレクトリの中のファイルから選ぶ 「そんな使い方もあるんですか ? 」 るだろうね」 、「あるいは , コモンダイアログから一部の機能を削除するような使い方もあ ような使い方に徹するべきなんですね ? 」 「わかりました。あくまでも , 普通のコモンダイアログになにかを追加する からね」 ほうがいい。本来とは似ても似つかぬ形にして使うのは危険だし美しくない 用だ。それよりは普通のリストボックスに DlgDirList あたりの API を使った のファイルオープンのダイアログを修正して利用するなんていうのは悪い応 ホラムズ「例えば , ディレクトリの一覧表を表示するためだけに , コモンダイアログ 「それはどういうことですか ? 」 らね」 ンダイアログの共通デザインを利用する根本的な意味がなくなってしまうか ☆ / ヾステル ☆ / ヾステル マホラムズ ☆ / ヾステル ☆ / ヾステル ☆ / ヾステル ☆ノヾステ丿レ ☆ / ヾステ丿レ ☆パステル ダイアログのプログラムは DLL に入っているから変更できないし。 らいいんですか ? 」 マホラムズ「コモンダイアログの API で使用する構造体の定義を見てごらん。ダイアロ グテンプレートの名前を指定するメンバがあるはずだ」 「ええと , ファイルオープンの構造体は OPENFILENAME 構造体・・・・・・あ , れですね ? 最後にある lpTemplateName っていうメンバ」 く自分のプログラムの中にあるわけだから , それがどのファイルなのかをコ マホラムズ「当然のことだけれど , ダイアログテンプレートは COMMDLG. DLL ではな 「え ? 」 マホラムズ「いや , まだ完璧じゃないよ」 「わかりました ! これで完璧ですね ! 」 するわけだ」 ホラムズ「そうた。ここに自分でデザインしたダイアログテンプレートの名前を指定 マホラムズ「そうじゃない。この構造体の hlnstance というメンバがあるだろう ? 「ファイル名を指定するんですか ? 」 モンダイアログに教えてやらなければならない」 どうした
第 14 章 API スへシャル 「な , なんだって ? 人が , こんなに心配していたというのに」 ・ Windows 誘拐事件ク 「ねーねー。バーチャルファイトって面白いのよ。あとで買って帰りましようねえ」パ ステルは , ひとりではしゃいでいた。 もしかして , 僕はなにか大きな勘違いをして結婚してしまったのだろうか。 そんな気もちがふとよぎった。 「だって , 3D ポリゴンが , バリバリなめらかに動くのよ」とパステルがいった。 反射的に僕は答えてしまった。「それはすごいな。よし ! 買って帰ろう」 この作品はフィクションであり , 登場するすべての名前や事件は架空のものです。 おわり
第 12 章画面に残されたメッセージ ワードを設定する仕組みだね。しかし , こでは詳しい説明を割愛する。いいね ? 」 いては , これをサポートするための関数につ マホラムズ「スクリーンセーバーの設定ダイアログボックスでなにか特殊なことをやり ■ワタソン「いったい , なにに使うんだい ? 名前からは内容がピンとこないんだけど」 く必要のある関数だ」 「次にいこうか。 RegisterDiaIogClasses だね。これもプログラマが自分で書 ワタソン「わかった。注意するよ」 いいね」 出すものだ。 ScreenSaverProc には必ずこの DefScreenSaverProc を使うこと。 められている。ライプラリが提供する関数で , 自分で書くものではなく呼び マ・ホラムズ「次に DefScreenSaverProco これは DefWindowProc の代わりに使うことが決 と早くからいろいろやってみるんだったなあ」 ワタソン「これはいいな。こんなに簡単にスクリーンセーバーが書けるのなら , もっ 「凝った表示をプログラムしなければね」 ■ワタソン「じゃ , 簡単なんだね」 望する表示を行うルーチンを追加するくらいなもんだろう」 意してあるから , あらためて自分のプログラムの側で書くものといえば , 希 ホラムズ「だって , スクリーンセーバーとしての共通の機能はライプラリのほうで用 「とくに決まってないなあ」 0 ワタソン「それで , どんな内容を書けばいいんだい ? 」 と同じだ」 ロトタイプは , マニュアルを調べてくれたまえ。基本的にはウインドウ関数 マホラムズ「そう。これはプログラマが自分で書かなければならない関数だ。正確なプ ■ワタソン「さっき名前が出ていたね」 マホラムズ「残りの関数については詳しく説明しよう。まず ScreenSaverProc からだ」 だが別になくても動く。これも説明は省くよ」 た場合の処理を提供する関数で , 処理はプログラマが書かねばならないもの マホラムズ「 HelpMessageFilterHookFunction は , 設定ダイアログの中で FI キーを押し 「わかった。先を続けてくれ」 ートするかどうかはプログラマの裁量に任されている」 マホラムズ「いずれもプログラマが自分で書くべき関数だ。しかし , パスワードをサポ DlgInvalidPassword の 3 つだったよね」 「うん。ええと , 確か D ー g C h a n g e P a s s w 0 r d , D ー g G e t P a s s w 0 r d , ホラムス マホラムス ■ワタソン「え ? 」 マホラムズ ワタソン ■ワタソン 臨ワタソン「わかった」
コモンタイアログを然め / コモンダイアログって知っているかしワほら , ファイルを開くとか名前をつけて保存するとか , そ ラやってよく使われるダイアログボックスは , あらかじめ期 ndo Ⅳ s システムに含まれているんだ。 それを使えば : プログラムが小さくなるし , プログラミングの手間も減る。でも , そんな決まりき ったダイアログボックスじゃ満足できないと思ったら・・ ワタソン談 0 ワタソン氏バステルを見舞う ■ワタソン「ホラムズ , っき合わせちゃって悪いな」 マホラムズ「いやあ , かまわないさ」 ■ワタソン「でも , っき合ってくれるとは思わなかったな」 マホラムズ「だってほら , 珍しいじゃないか。朴念仁の君が , 女の子を見舞うなんて」 ■ワタソン「僕はそんなに朴念仁じゃないぞ。後輩が 2 週間も大学に顔を見せないと聞け ば , 見にいくくらいの義務感はあるさ」 マホラムズ「義務感ね。やつばりカタブツだなあ」 0 ワタソン「な , なにをいっているんだ。そうでなかったら , あんなパステルの下宿な んかに , わざわざ自分から行くものか。やつれ切ってひどい病気らしいと聞 いたから行ってやるだけで・・・・・・」