データリンクDDEにおけるデータリンクとは、サーバー内のデータが変更された際に、クライアントへ通知を行う機能のことを指します。後者は変更されたデータそのものを通知します。データリンクの確立はWM_DDE_ADVISEで可能であり、それはWM_DDE_UNADVISEを送るまで有効です。クライアントは、サーバーからの通知をWM_DDE_DATAとして受け取ることになります。今回のプログラムは、Excelの特定のセルが変更された際に通知を受け取ります。プログラムを起動する前に、sample.xlsxを開いたExcelを起動しておいてください。TEXT("DDE対話の確立に失敗しました。TEXT("データの変更が通知されました。bResult;}WM_CREATEではサーバーとの対話を確立すると共に、WM_DDE_ADVISEでデータリンクも確立しています。{GlobalDeleteAtom(atomItem);GlobalFree(hData);}WM_DDE_ADVISEのLPARAMには、DDEADVISE構造体とグローバルアトムが含まれていなければなりません。上記の場合であればR2C1に相当するセルのデータ変更を検出する意味を持ちます。DDEADVISE構造体はGlobalAllocで確保するようにし、GlobalLockを呼び出してからメンバにアクセスします。cfFormatはデータを受け取る形式であり、テキスト形式を望む場合はCF_TEXTでよいでしょう。fAckReqは、WM_DDE_DATAにおけるDDEDATA構造体のfAckReqに格納したい値を指定します。fDeferUpdは、ウォームリンクの場合にTRUEを指定し、ホットリンクの場合にFALSEを指定します。データ変更の通知の際にはデータそのものが送られることになります。uDataが0x8000であればリンクは成功し、0の場合はリンクが失敗したことを意味します。WM_DDE_ADVISEが送られた後でR2C1のセルが変更されたら、WM_DDE_DATAがクライアントに送られることになります。bWarmLinkがTRUEの場合はデータを参照しないようにします。UnpackDDElParamで取得できるhDataがNULLになるためです。クリップボードにLink形式のデータを設定する機能を持っています。Excelのセルをコピーした場合は、Link形式のデータがクリップボードに設定することになっています。Link形式のフォーマットは次のようになります。itemの部分にはアイテム名が格納されます。各情報は\0文字で区切られているため、これを頼りに情報を取り出すことになります。TEXT("Link形式のデータが存在しません。bResult;}Link形式のクリップボードフォーマットは、RegisterClipboardFormatにLinkを指定すれば取得できます。Link形式のデータが設定されていないことを意味するため、終了するようにしています。for文ではデータからアプリケーション名、トピック名、アイテム名を取得するようにします。これは問題ありません。アイテム名が不正になることは考えられないため、WM_DDE_ACKが返ることはないでしょう。WM_DDE_DATAでデータを受け取ったら、WM_DDE_TERMINATEで対話を終了しています。これは今回のプログラムが、WM_DDE_INITIATEを複数回呼び出す可能性があるためです。