Ask Dr. GUI #55

2000 年 11/12 月号

.NET についてもう少し

Dr. GUI は前回 NET Framework についてかなり多くのことを書きましたし、.NET Framework API については(Web で公開予定のチュートリアル シリーズを含めて)、これからも引き続き書いていこうと思っています。

そこで名医は、以前の情報を蒸し返すよりは、前回のコラム以降の最新情報を皆さんにお届けしようと思います(以前の情報をまだ読んでいない方は MSDN News 9-10 月号と http://msdn.microsoft.com/library/welcome/dsmsdn/drgui54.htm から入手できます)。

その 1、皆さんがこれを読む頃には Beta 1 が入手可能になっているはずです。http://msdn.microsoft.com/net/ を確認してください。ここには他にも役立つ情報が満載されています。Dr. GUI は皆さんがこのサイトを気に入ってくれると信じています。

その 2、C# と言語共通インターフェイスは、European Computer Manufacturers Association(ECMA)によって標準化の準備が進められています。このプロセスには多少時間がかかりますが、最終的には多様なプラットフォーム上で利用できる .NET Framework のとても役立つサブセットになるはずです。

Dr. GUI は未来を手中に収める

Dr. GUI は未来を見た。

名医が Compaq iPAQ Pocket PC を手に入れたことは前回お話しました。なんと、その後で他にも手に入れたものがあるのです。それは iPAQ 用の PC/MCIA ジャケットです。(9 月現在では「非常に」入手困難です。eBay で 1,000 ドル以上もの値が付いて売りに出ていました。皆さんがこれを読む頃には、多分もっと入手しやすくなっているでしょう)。Dr. GUI は幸運にも Microsoft の購買部で注文し、いち早く手に入れることができました。

Pocket PC にジャケットを装着すると、そこに PC/MCIA カードを差し込めます。それはフルサイズの Type II カードで、それには私たちが Microsoft で使っている IEEE 802.11 ワイヤレス LAN カード用の Microsoft® Windows®CE ドライバがたまたま入っています。ということは、社内のどこにいても iPAQ は Microsoft の社内 LAN にワイヤレスで接続しているということです。この接続は 11 Mbps までの広帯域です。

新しい世界

これで Pocket PC ユーザーの新しい用途が開けました。第一に、Web の閲覧が現実的になります。こんな小さな画面にしては驚異的ではないですか!(Pocket Internet Explorer を開発した人たちは「画面サイズに納める」のに良い仕事をしましたが、Dr. GUI としては拡大・縮小もできればよいと思っています)。それから名医は電子メールで送られてきたリンクを初めて開くことができました(Dr. GUI には、電子メールのリンクを通じてリンクされたページを、なぜ同期化プログラムが自動的に Internet Explorer のキャッシュに入れないのか分かりません。ラップトップの Microsoft Outlook® の同期化プログラムもやはりキャッシュに入れません)。もちろん名医は、Microsoft ActiveSync® テクノロジを利用してラップトップと同期させたり、IMAP4 プロトコルを通じて電子メールにアクセスしたりできます。(Pocket PC が PPTP をサポートしてさえいれば、自宅で Ethernet カードと DSL が使えるのですが ...)。

このデバイス一式は重くて大きいのですが、それでも名医のポケットには収まります。長年コンピュータに関わっている Dr. GUI には、もう少しすればこのデバイスがさらに便利に、小さく、速く、値段も手頃になることが分かっています。今のところ大きくて重いのは、未来を手中に収めるための小さな代償なのです。

いつかは、どこでも高帯域幅

あと数年もして、広域の高帯域接続が可能になったときのことを想像してみてください。サービス区域内ならどこでも、音声と映像をデバイスに取り込むことができるのです。Web サーフィンができます。インスタント メッセージだってできます。通信状態がよければボイスオーバー IP が可能なのに、誰が携帯電話を必要とするでしょう?Dr. GUI は皆さんの中に、次のキラー アプリケーションを考えつき、具現化して金持ちになる賢い開発者の方が現れると確信しています。http://www.microsoft.com/mobile/developer/ で、Pocket PC の開発ツールが無償で(発送料と手数料を除く)入手できることを覚えておいてください。

それまでの間は、既存の低速の広域ワイヤレス ネットワーク(およそ 14.4 kbps)で我慢しなければなりません。とは言っても、iPAQ、PC/MCIA ジャケット、ワイヤレス LAN の値段で、自宅や職場で高帯域幅の未来を試すことができるのです。

その他の面白いハードウェア

Dr. GUI はディスク容量が足りなくなってしまったこともあり、今年は新しいラップトップを手に入れることにしました。今年のラップトップは前のモデルと比べて軽くなっているのに、メモリは 50%増え、ディスク容量は 2 倍、CPU 速度は 2 倍以上です。インフレが進んだというのに値段は去年のモデルより 900 ドルも安かったのです。驚きです。

名医には、.NET(まだ実運用向けではありません)の仕事をするために手頃な値段のマシンも必要でした。そのデスクトップは(Compaq iPAQ デスクトップ)、733 MHz の CPU を搭載しており、Windows 2000 がインストールされていましたが、重さは 5 キロほどしかないので家に持ち帰ることができました(Windows 2000 がインストール済みのこの製品ラインの中では一番安いモデルは 499 ドルでした)。

どこでも Web?

まだそうはいかないでしょうが、影響は至るところにあります。Dr. GUI は最近、小さな液晶表示画面が付いている電子レンジを手に入れました。つまみをまわして押したり、他のボタンを押したりしてメニューを選択します。メニューは主にテキスト ベースで、携帯電話で Web を閲覧するようなものです。

何が名医を驚かせたかというと、画面の下に「Home」(ホーム)、「Back」(戻る)、「Favorites」(お気に入り)と書かれたボタンがあったことです。これは明らかに Web ブラウザを意識したものです(Dr. GUI は、電子レンジの名前が「Navigator」でないようにと願ったことを認めます)。

この電子レンジは、Dr. GUI のホーム ネットワークに接続しませんが、それ以外は究極の「おたく」レンジです。ピザ専用のお皿まで付いています。

けれども、このテキストベースのユーザー インターフェイスの使い方を、私たちと一緒に住んでいる Dr. GUI のパートナーの祖母に教えるのは難題です。彼女は英語を話したり読んだりしません。そこで結局は、あまり高くない古きよき時代のダイヤルが付いた 2 台目の電子レンジを買うことになるかもしれません。

私のハートはいつもあなたに TrueType

親愛なる Dr. GUI へ

Win API の GetGlypOutline 関数で受け取った構造体についての詳細情報は、どこで入手できますか?Help ファイルに少しは説明がありましたが、この構造体から正しいアウトラインを作ることがどうしてもできません。

よろしくお願いします。

ロバート パーソン

Dr. GUI の回答:

説明文書の内容を理解するのは、問題の半分でしかありません。名医は GetGlyphOutline の説明文書が、ただの概要説明に退化しているのを見て胸が潰れる思いがしました。そこで「GetGlyphOutline について、いつも知りたいと思っていても尋ねにくかったことすべて」をお話したいと思います。

名医は現在の状態を改善するために、GetGlyphOutline 関数を使って TrueType のグリフ アウトラインを取得する方法を以下で概説するとともに、ネイティブ バッファ フォーマットについて直接解説している Microsoft Knowledge Base の記事をいくつか紹介します。

GetGlyphOutline を使ってネイティブ TrueType アウトラインを取得するには、uFormat パラメータに GGO_NATIVE を指定して関数を 2 回呼び出さなければなりません。最初の呼び出しでは、バッファにはゼロ (0) を、バッファのポインタには NULL を渡します。そうすれば関数は必要なバッファ サイズをバイト数で返します。バッファを割り当てた上で適切なパラメータを指定してもう一度関数を呼び出せば、アウトラインのバッファを取得できます。

現在の説明書とは逆に、MAT2 パラメータが関数呼び出しの結果に変更を加えることに注意してください。無修正のアウトラインが必要な場合は、MAT2 パラメータに真の識別マトリックスを確実に渡してください。識別マトリックスは、メンバの eM11 と eM12 の値が 1、その他のメンバの値がゼロ(0)に設定された MAT2 構造体です。

アウトラインの取得は簡単、大変なのはデコードです(技術のコラムにユーモアを交えて書くのとは訳が違うのです)。ネイティブ データに基づいてアウトラインを描画するのに参考になる文献と情報は次の通りです。

ネイティブ バッファ フォーマットを理解するには、TTPOLYGONHEADERTTPOLYCURVEPOINTFX 構造体の説明文書を探し出して理解する必要があります。この構造体の説明文書は正確ですが、GetGlyphOutline の説明文書には参考文献としては挙げられていません。これらにはネイティブ アウトライン データについて、やや簡潔な言葉で説明されています。これらの構造体と GGO_NATIVE バッファの形式についての更に詳しい解説は、次の Knowledge Base の記事を調べてみてください。これにはネイティブ バッファを解析して、バッファに入っている二次 B スプライン曲線を描画することのできるサンプル コードが含まれています。

Q243285: HOWTO: "Draw TrueType Glyph Outlines" (http://support.microsoft.com/support/kb/articles/Q243/2/85.asp)

Windows 3.1 時代のとても古い Knowledge Base の記事もあって、これにもネイティブ バッファ形式の説明が載っています。

Q87115: HOWTO: "GetGlyphOutline() Native Buffer Format" (http://support.microsoft.com/support/kb/articles/Q87/1/15.asp)

Windows の 3.x 版あるいはベジエ曲線描画関数が利用できないかもしれない Windows 以外のプラットフォームでコードを実行する必要がある場合には、次の Knowledge Base の記事を参考にすると良いでしょう。

Q135058: "How to Draw Cubic Bezier Curves in Windows and Win32s" (http://support.microsoft.com/support/kb/articles/Q135/0/58.asp)

TrueType アウトラインの輪郭に二次 B スプライン曲線が使用されている方法については、TrueType 仕様 1.66 版を参照してください。MSDN CD または http://www.microsoft.com/typography/ から入手できます。

Microsoft Windows 95 か Microsoft Windows 98 で Unicode を使って作業をしている方は、次の Knowledge Base の記事を参照してください。これには GetGlyphOutline 関数で Unicode を使用する方法が解説されています。

Q241020: HOWTO: "Translate Unicode Character Codes to TrueType Glyph Indices in Windows 95" (http://support.microsoft.com/support/kb/articles/Q241/0/20.asp)

Q241358: PRB: "The GetGlyphOutlineW Function Fails on Windows 95 and Windows 98" (http://support.microsoft.com/support/kb/articles/Q241/3/58.asp)

「*C/C++ Users Journal」*の 1999 年 8 月号にも「TrueType Font Secrets」という題名で TrueType Outlines についての紹介記事が載っています。この記事は TrueType アウトラインについて異なった新鮮な見解を与えてくれます。

以上の情報があれば、もうアウトラインは描けますよね。そこで名医はアウトラインの説明文書(それとも説明文書のアウトラインかな?)の残りを訂正して、ドラマチックに終ろうと思います。

とにかく現在の説明文書の記述に反して、GGO_GLYPH_INDEX フラグは ABC 文字間隔とは何の関係もありません。このフラグが渡されると、UINT uChar パラメータは、文字コードではなく 16 ビットの TrueType グリフ インデックスであると解釈されます。グリフ インデックスは GetCharacterPlacement 関数か、先述の Knowledge Base の記事 Q241020 に示されているテクニックを使用して取得できます。説明文書に書かれているようにフォントが OUTLINETEXTMETRIC 構造体の otmEMSquare と等しいサイズで描画されない限り、GGO_NATIVE フォーマット フラグを指定してもデータは設計単位では返されません。また、ラスタライザーは回転ばかりでなく、MAT2 構造体で表せるどんな変換も適用できます。最後に GGO_GRAY8_BITMAP フラグは、バイト値の範囲が備考欄に示されている 255 ではなく、0 から 64 までのビットマップを返します。

図書館は何時に開くのでしょうか?

親愛なる Dr. GUI へ

私はオートメーション機能を利用して Excel を制御するアプリケーションを C++ で書いており、マクロ名のリストを取得したいと考えています。マクロ名を、C++ アプリケーションのリスト コントロールのリストに入れたいのですが、Excel 内で名前が保存されている場所を特定できません。

私はライブラリ関数 Excel8.olb を使用しています。

マクロが保存されているクラスとマクロ名にアクセスする方法を教えてください。

それではまた。

セバスチャン モヨン

Dr. GUI の回答:

ああ、ライブラリ!名医はものすごく長い年月を図書館で過ごしました、小学校から高校まで(木のテーブルの側面に彼女のイニシャルをペンナイフで彫ったものです)そして大学からメディカル スクールにかけて(Gray の「*Anatomy of the Human Body」*にぎっしりとメモを書き込みました)。でも名医が一番覚えているのは図書館の埃です。名医は学生生活の間、何度くしゃみをしたことか!来たる新千年紀には、書類から Pocket PC に至るまで何でも読めて、コメントまでできるとは嬉しい限りです。

おっと、すっかりノスタルジーに浸ってしまいました。ここらで止めて、質問に移りましょう。

Microsoft Excel ワークブックのマクロのリストを取り出すには、Excel タイプ ライブラリ用のクラス ラッパーに加えて、Microsoft Visual Basic® for Applications (VBA) Extensibility ライブラリ用のクラス ラッパーを作成する必要があります。VBA Extensibility ライブラリは Excel のオブジェクト モデルを拡張するので、ワークブックの VBA プロジェクト用のさまざまなクラス、特にワークブックの VBProjectVBComponents コレクションを使って作業できます。VBA Extensibility タイプ ライブラリは、Office 97 用は VBEExt1.olb で、Office 2000 用は VBA6Ext.olb です。

Excel タイプ ライブラリと VBA Extensibility タイプ ライブラリから生成されたラッパー クラスを使用して、ワークブックにあるマクロのリストを取り出す方法は次の通りです。次のプログラム コードで、VBA Extensibility ライブラリ用クラス ラッパーは、Excel クラスとの名前の衝突を避けるためにネームスペース VBAExt を使用していることに注意してください。

  COleVariant vOpt(DISP_E_PARAMNOTFOUND,
   VT_ERROR); //for Optional args
//Start Excel and open the workbook
_Application oApp;
oApp.CreateDispatch("Excel.Application");
Workbooks oBooks = oApp.GetWorkbooks();
_Workbook oBook =
      oBooks.Open("C:\\book1.xls",
         vOpt, vOpt, vOpt, vOpt, vOpt, vOpt,
         vOpt, vOpt, vOpt, vOpt, vOpt, vOpt);
//Get a reference to the VBComponents
//collection for the workbook's
//VBA project
LPDISPATCH lpDisp = oBook.GetVBProject();
VBAExt::_VBProject oVBProj;
oVBProj.AttachDispatch(lpDisp, TRUE);
VBAExt::_VBComponents oVBComps =
         oVBProj.GetVBComponents();
//Iterate the VBComponents to extract
//sub/function procedure names
long lProcKind = 0;
for(long i=1; i<=oVBComps.GetCount(); i++)
{
  VBAExt::_VBComponent oVBComp =
         oVBComps.Item(COleVariant(i));
  VBAExt::_CodeModule oCode =
         oVBComp.GetCodeModule();
  long j=1;
  while(j<oCode.GetCountOfLines())
  {
     CString sProcName =
         oCode.GetProcOfLine(j, &lProcKind);
     if(!sProcName.IsEmpty()){
        AfxMessageBox(sProcName);
        j = j +
            oCode.GetProcCountLines(sProcName,
                     lProcKind); }
     else {
        j++;    }
  }
}

//Close the workbook and quit Excel
oBook.Close(COleVariant((short)FALSE),
            vOpt, vOpt);
oApp.Quit();

このアプローチは、他の種類の Office 文書のマクロのリスト作成にも使用できます。

ディスクをかじろう

親愛なる Dr. GUI へ

最近の MSDN NEWS に、「editable(編集可能な)」 Web ページの作り方が載っていました。私はオフィスで長時間働いた後、「edible(食べられる)」 Web ページが欲しいと思い始めました。Microsoft Internet Explorer に、そんな機能はありますか?もしなければ、ぜひ次のバージョンの緊急開発リストに入れるべきです。

レナート バウアー(まだドクターではありません)

Dr. GUI の回答:

あなたの質問にあまりにも途方にくれたので、Dr. GUI のお気に入りだった以前の患者に相談する必要があると思いました。彼女はこのような問題の専門家なのです。彼女を仮に「エミリー L」と呼びましょう。名医が彼女に会って治療したのは土曜の夜だけでした。でもこれは何年も前のことです。

少し時間はかかりましたが、名医はついにエミリーの魂とのチャネリングに成功しました。「食べられる Web ページなんて何をそんなに騒いでいるの?それはともかく、ビットをどうやって食べるつもり?そんなもの、まずいに決まってるじゃないの!それにビットをインターネットに乗せるなんて危険よ、そのビットがどこにあったかわからないじゃない?食べられる Web ベージなんて必要ないわ!」

「えっ、編集できる Web ページ?もういいわ」

名医の知る限り Internet Explorer の将来のどのリリースにも食べられる Web ページの予定はないのですが、レナート、あなたはインターネットの進化の次の段階に足を踏み入れたのだと名医は信じます。それは食の革命に留まらず、電子商取引を完全に変えてしまいます。配達されるのを待つ必要がないのです!素晴らしい新技術が開発され、モニタを通じて「注文して食べられる」日が名医には見えます。

ハンバーガーの絵を 2 回クリックすれば、それが自動的に A: ドライブに移動します。ディスクを取り出しデスクトップの再構築ユニットに入れて数分経つと .... はい、ランチのでき上がり。食べ物を取りに行くためにコンピュータの前を離れなければならないと、いつも不満を言っているハイテクとコンピュータおたくにとって、これは奇跡です。

あなたの質問で Dr. GUI は、ミシガン大学で 80 年代始めの春にリリースされた「Pizza Delivery」というプログラムを思い出しました。ミシガン州の主要な大学は専用回線で相互接続していたので(インターネット以前の時代です)、ミシガン州立大学(Dr. GUI の出身校)の情報科学コースの仲間の一人が、ある日そのプログラムを発見して何も知らずに電子掲示版(ニュース グループの前身)で、Little Caesar's は店の中に端末か何かを持っているのですかと、Pizza Delivery の動作方法を質問したのです。

それをきっかけに、激しい議論(FORTRAN と Pascal をめぐる大激論よりも激しいくらい)が始まりました。それには、問題の次世代のネットワークでの物質転送能力や(ピザを電子レンジにダウンロードするだけ .... このコラムの前の「どこでも Web?」参照)、個人サイズの「PC」ピザがいいか、あるいは「メインフレーム」ピザの共有機能がいいかという話題まで含まれていました。

最後に、誰かが私の友人を気の毒がって、そのプログラムが 4 月 1 日に掲示されたことに彼が気が付いているかと聞きました。

レナート、この技術を発明したら名医に電話をください。あなたの IPO に投資します!

もう一度ありがとう!

Dr. GUI はスタッフに感謝します。彼らがいなければこのコラムは存在していません。名医は皆さんも彼らに感謝したいと思っていることを知っています。チームのメンバには、グレッグ エリソン、 ローリ ターナー、ジョー クランプ、リチャード テイラー、素敵で可愛い「猫好き」ペニー ライカーがいます。