レガシー Windows API(概要)について

ここで紹介しているAPIは、Windows95、Windows NT3.5時代のAPI群であり、最新のAPIは含まれていないことに注しして欲しい。なお、当時の解説書は現在よりもより詳細に解説しているため、参考になるはずである。

  • レイアウトを変換する際、崩れているページがあります。
  • 概要およびSampleコードはありますが、APIの解説はありません。

ご要望があれば旧版のWin32 API(HELP形式)をお譲りします。問い合わせフォームより申し込みください。

Windows API アトムの概要

Microsoft(R) Win32(TM) のアプリケーション プログラミング インターフェイス (API) における「アトム テーブル」とは、 文字列とそれに対応する識別子を格納する、 システム定義のテーブルのことです。アプリケーションは、 アトム テーブルに文字列を格納すると、 「アトム」と呼ばれる16ビットの整数を受け取ります。このアトムは、 文字列にアクセスするときに使います。アトム テーブルに置かれている文字列は、 「アトム名」と呼ばれます。

動的データ交換 (DDE) アプリケーションは、 アトム テーブルを使って、 項目名やトピック名をほかのアプリケーションと共有します。DDEアプリケーションは、 受け手側のアプリケーションに、 実際の文字列ではなくアトムを渡します。受け手側は、 アトムを使ってアトム テーブルから文字列を取得します。

次の各トピックでは、 アトムについて説明します。

グローバル アトム テーブル

ローカル アトム テーブル

アトムの種類

アトムの作成と使用カウント

アトム テーブルの問い合わせ

アトム文字列の形式

アトムの使用

アトム関数

グローバル アトム テーブル

Windowsの「グローバル アトム テーブル」は、 37個までのエントリを格納することができ、 すべてのアプリケーションから利用可能です。アプリケーションが文字列をグローバル アトム テーブルに置くと、 システムは、 システム全体で一意なアトムを生成します。そのアトムを持つアプリケーションは、 グローバル アトム テーブルに問い合わせることによって、 アトムが識別する文字列を取得できます。

プライベートなクリップボード データ形式や、 ほかのアプリケーションとデータを共有するためのDDEデータ形式を定義しているアプリケーションは、 形式名をグローバル アトム テーブルに置いてください。これにより、 システムやほかのアプリケーションが定義した形式の名前と重複しないようにすることができ、 メッセージや形式のID (アトム) をほかのアプリケーションが利用できるようになります。

ローカル アトム テーブル

アプリケーションは、 「ローカル アトム テーブル」を使って、 そのアプリケーション内だけで使われる多数の文字列を効率的に管理できます。ローカル アトム テーブルの文字列とアトムは、 そのテーブルを作成したアプリケーションだけが利用できます。

多数の構造体で同じ文字列を必要とするアプリケーションは、 ローカル アトム テーブルを使ってメモリの使用量を減らしてください。アプリケーションは、 文字列を各構造体にコピーせずに、 文字列をアトム テーブルに置いて、 その文字列のアトムを構造体に設定してください。このようにすれば、 アプリケーション中で何度も使われる文字列をメモリ中に1つ置くだけで済みます。

また、 特定の文字列を検索するときにローカル アトム テーブルを使えば、 検索の時間を節約できます。アトム テーブルを使って検索を行うには、 検索文字列をアトム テーブルに置き、 そのアトムを関連する構造体のアトムと比較するだけです。通常は、 文字列を比較するよりもアトムを比較するほうが高速です。

デフォルトでは、 ローカル アトム テーブルにはエントリを37個までしか格納できません。しかし、 ローカル アトム テーブルのサイズは変更することができます (グローバル アトム テーブルのサイズは変更できません)。アプリケーションは、 InitAtomTable関数を使ってテーブルのサイズを変更できます。しかし、 InitAtomTableは、 ほかのアトム管理関数を呼び出す前に呼び出さなければなりません。

アトムの種類

アプリケーションは、 文字列アトムおよび整数アトムの2種類のアトムを使うことができます。以下のトピックではこれらの2種類のアトムについて説明します。

文字列アトム

整数アトム

文字列アトム

アプリケーションは、 NULLで終わる文字列をアトム テーブルに渡して、 「文字列アトム」(16ビットの整数) を取得できます。文字列アトムには、 次に示す特徴があります。

文字列アトムの値の範囲は、 0xC000から0xFFFFまでである。

アトム テーブルでアトム名を検索するときは、 大文字小文字の区別は考慮されない。また、 検索では、 文字列全体が同じでなければ一致したとはみなされず、 部分文字列が同じでも一致したとはみなされない。

文字列アトムに関連付けられている文字列のサイズは、 255バイト以下でなければならない。この制限はすべてのアトム関数に適用される。

各アトム名には、 「参照カウント」が関連付けられている。テーブルにアトム名を追加するとカウントが1つ増やされ、 アトム テーブルからそのアトム名を削除するとカウントが1つ減らされる。これにより、 同じ文字列をほかのコンテキストで使っているときに、 そのコンテキストのアトム名を削除してしまうことがなくなる。アトム名の参照カウントが0になると、 システムはアトムとアトム名をテーブルから削除する。

整数アトム

「整数アトム」は、 次に示す点で文字列アトムとは異なります。

整数アトムの範囲は0x0001から0xBFFFまでであり、 整数アトムの範囲と文字列アトムの範囲は重ならないため、 同じコードで両方の種類のアトムを使うことができる。

整数アトムの文字列表現は、 #dddd (dddd10進数) である。先行する0は無視される。

整数アトムには、 参照カウントや記憶容量などのオーバーヘッドがない。

一部のWindows関数は、 文字列アトムや整数アトムをパラメータとして受け取ります。これらの関数に整数アトムを渡すときは、 MAKEINTATOMマクロを使ってアトムを作成してください。

アトムの作成と参照カウント

「ローカル アトム」を作成するには、 AddAtom関数を呼び出します。「グローバル アトム」を作成するには、 GlobalAddAtom関数を呼び出します。どちらの関数も、 文字列を指すポインタを必要とします。システムは、 適切なアトム テーブル内でその文字列を検索し、 対応するアトムをアプリケーションに返します。文字列アトムの場合、 文字列がアトム テーブル内にすでに存在していれば、 システムはその文字列の参照カウントを1つ増やします。

アトム追加関数を何度も呼び出して同じアトム名を追加しても、 同じアトムが返されます。AddAtomを呼び出したときにアトム名がテーブルに存在しなければ、 そのアトム名はテーブルに追加され、 新しいアトムが返されます。また、 文字列アトムの場合は、 参照カウントが1に設定されます。

ローカル アトムが不要になったら、 DeleteAtom関数を呼び出してください。グローバル アトムが不要になったら、 GlobalDeleteAtom関数を呼び出してください。文字列アトムの場合、 これらの関数を呼び出すと、 対応するアトムの参照カウントが1つ減らされます。参照カウントが0になると、 システムはアトム名をテーブルから削除します。

グローバルな文字列アトムのアトム名は、 そのアトム名をテーブルに置いたアプリケーションが終了しても、 参照カウントが0にならない限りグローバル アトム テーブルに残ります。ローカル アトム テーブルは、 テーブル内のアトムの参照カウントの値にかかわらず、 アプリケーションが終了するときに破棄されます。

アトム テーブルの問い合わせ

特定の文字列がアトム テーブルにすでに存在するかどうかを判断するには、 FindAtom関数やGlobalFindAtom関数を使います。これらの関数は、 指定された文字列をアトム テーブル内で検索し、 文字列が存在していれば、 対応するアトムを返します。

必要なアトム名文字列に対応するアトムがわかっているときは、 GetAtomName関数やGlobalGetAtomName関数を使ってアトム名文字列をアトム テーブルから取得できます。どちらの関数も、 指定されたアトムのアトム名文字列をバッファにコピーして、 コピーした文字列の長さを返します。GetAtomNameはローカル アトム テーブルからアトム名文字列を取得し、 GlobalGetAtomNameはグローバル アトム テーブルからアトム名文字列を取得します。

アトム文字列の形式

AddAtom関数、 GlobalAddAtom関数、 FindAtom関数、 およびGlobalFindAtom関数は、 NULLで終わる文字列を指すポインタを引数にとります。この文字列は、 次に示す方法のいずれかを使って指定できます。

形式説明

#dddd 整数を10進数文字列として指定します。整数アトムの作成または検索に使われます。

「文字列アトム名」文字列アトム名を指定します。文字列アトム名をアトム テーブルに追加してアトムを取得するときに使われます。

アトムの使用

アトムは、 動的データ交換 (DDE) アプリケーションでよく使われます。DDEプロトコルでは、 データを交換しているアプリケーション、 交換するデータの形式、 および実際に交換しているデータを識別する際に、 グローバル アトムが使われます。DDEの詳細およびアトムの使用例については、 動的データ交換の概要を参照してください。

アトム関数

アトムに関する関数を次に示します。

AddAtom

DeleteAtom

FindAtom

GetAtomName

GlobalAddAtom

GlobalDeleteAtom

GlobalFindAtom

GlobalGetAtomName

InitAtomTable

使われなくなったか、 または削除された関数

GetAtomHandle

▲ページトップに戻る

【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします
inserted by FC2 system