文字列という可変長のデータを、アプリケーション間で受け渡すのは難しいものがあります。文字列を渡すためにはWM_COPYDATAなどの別の仕組みが必要です。相手側はその値を基に文字列を取得できるのではないでしょうか。ここで役に立つのがグローバルアトムです。ここにはどのようなアプリケーションでも任意の文字列を格納することが許されています。これがあればいつでも関連する文字列を取得できます。間接的に文字列の受け渡しを再現できるようになります。グローバルアトムを必要とするアプリケーションは、最初にGlobalAddAtomを呼び出すことになります。その文字列を識別する値(グローバルアトム)を返します。lpString);lpStringは、グローバルアトムテーブルに格納する文字列を指定します。戻り値は、この格納した文字列を識別するグローバルアトムになります。アトムには、文字列アトムと整数アトムの2種類が存在します。アトムの値は0xC000から0xFFFFの間になります。文字列内の大文字と小文字は区別されず、後述するように参照カウントを持ちます。アトムの値は0x0001から0xBFFFの間になります。その後には任意の数値を指定します。基本的に整数アトムは使用しないと思われるため、文字列アトムを例に話を進めていきます。アプリケーションが終了しても自動で削除されるようなことはありません。文字列を削除するには、GlobalDeleteAtomを呼び出します。nAtom);nAtomは、削除したい文字列に関連するグローバルアトムを指定します。これは他のアプリケーションに渡すことができます。GlobalGetAtomNameで関連する文字列を取得できます。nSize);nAtomは、グローバルアトムを指定します。lpBufferは、グローバルアトムに関連する文字列を受け取るバッファを指定します。nSizeは、lpBufferのサイズを指定します。関数が成功した場合は、0でない値が返ります。文字列からグローバルアトムを取得する方法もあるはずです。これには、GlobalFindAtomを呼び出します。lpString);lpStringは、グローバルアトムテーブルから検索したい文字列を指定します。指定した文字列が見つかった場合は、文字列に関連するグローバルアトムが返ります。一見すると二重起動の防止に役立てるように思えます。アプリケーションが実行中であると見なすわけです。これは絶対にしてはならない使い方です。TEXT("二重起動が発生しました。TEXT("終了します。アプリケーションは処理を続行することになります。この間に再びアプリケーションを起動しようとすると、二重起動によってアプリケーションは終了することになります。理由は、GlobalFindAtomが文字列の検索に成功するからです。アプリケーションをタスクマネージャなどで強制終了したらどうなるでしょうか。この場合は、アプリケーションが存在しないにも関わらず、GlobalFindAtomは文字列の検索に成功することになります。グローバルアトムテーブルに文字列が残ってしまったからです。した事から分かるように、グローバルアトムテーブルは二重起動の防止に使用することはできません。GlobalDeleteAtomを呼び出しても必ず文字列が削除されるとは限りません。GlobalDeleteAtomはこの参照カウントを1つ下げます。これにより参照カウントが0になった場合は、グローバルアトムに関連する文字列が削除されます。同じ値が返ると共に参照カウントが1つ増えることになります。GlobalDeleteAtomも2回呼び出すことになります。GlobalDeleteAtomは、GlobalAddAtomを呼び出した回数だけ呼ばなければなりません。それに関連するグローバルアトムを自作のアプリケーションに送ります。TEXT("指定したウインドウクラスのウインドウが存在しません。lParam);}WM_CREATEで作成したグローバルアトムは、マウスの左ボタンが押された場合にアプリケーションへ送信されます。このアプリケーションが作成するウインドウのウインドウクラスは、receiverという文字列であると仮定します。WM_ATOMはWM_APPを基に定義したオリジナルメッセージであり、LPARAMにグローバルアトムを指定するものと仮定します。通信相手のコード例は次のようになります。lParam);}WM_ATOMが渡されたら、LPARAMからグローバルアトムを取り出してGlobalGetAtomNameを呼び出します。すると、グローバルアトムに関連する文字列を取得できます。通信元で定義されたsample-stringという文字列が、通信先に渡ったということになります。