ファイルダブルクリック起動のDDEに関して勉強中

otaky 120 評価のポイント
2024-07-05T04:37:40.44+00:00

データファイルをダブルクリックしたときに、
DDEを使用したアプリケーション起動、データファイルを開くを実装しており、
そのDDE通信がどのように行われているか勉強中なのですが。

下記は推測も入っています。

・エクスプローラ側(クライアント側)は、すべてのトップレベルウィンドウに、WM_DDE_INITIATE メッセージ(+ 2 つのアトム)をSendMessage関数で送信します。

・アプリ側(サーバー側)は、受け取ったアトムが自身の作成したアトムと同じか比較し、同じならば
クライアント側に、WM_DDE_ACKメッセージをSendMessage関数で送信します。

このときともにSendMessageで読んでいるので、デッドロックになるように見えますが、?
なぜデッドロックが起こらないのでしょうか。

C++
C++
C プログラミング言語の拡張機能として作成された高レベルの汎用プログラミング言語。低レベルのメモリ操作機能に加えて、オブジェクト指向、汎用、関数型の機能を備えています。
20 件の質問
{count} 件の投票

承認済みの回答
  1. とっちゃん 625 評価のポイント MVP
    2024-07-24T16:01:12.5+00:00

    学習したい項目は DDE のことですか?それともSendMessage を呼び合っていてデッドロックしない理由ですか?(ちなみにデッドロックの話はDDEとは無関係)。

    前者であれば、https://eternalwindows.jp/ipc/dde/dde00.html の記事が役に立つと思います(実際にプログラムコードの全文が載ってるので、動かしてデバッグするなども可能)。
    メッセージを送信しあうことで発生するデッドロックのことについてであればまずはここのあたりですかね?

    メッセージ デッドロック

    SendMessage はメッセージが処理されるまで帰ってきませんが、メッセージが再入しないとは一言も書いていません。
    SendMessage API は別スレッド(別プロセス上のスレッドを含む)のウィンドウを呼び出した場合は再入可能な状態で待機します。そのため、別スレッドからSendMessageされてきた場合は再入できる形で待機しています。

    0 件のコメント コメントはありません

2 件の追加の回答

並べ替え方法: 最も役に立つ
  1. otaky 120 評価のポイント
    2024-07-24T05:18:49.8833333+00:00

    推測ですが、

    explorer側

    ATOM atomApp, atomTopic;
    
    atomApp = GlobalAddAtom(TEXT("Excel"));
    atomTopic = GlobalAddAtom(TEXT("[sample.xlsx]Sheet1"));
    SendMessage((HWND)HWND_BROADCAST, WM_DDE_INITIATE, (WPARAM)hwnd, MAKELONG(atomApp, atomTopic));
    

    Server側

    
    case WM_DDE_INITIATE: {
    	ATOM atomApp = GlobalAddAtom(TEXT("aaa"));
    	ATOM atomTopic = GlobalAddAtom(TEXT("system"));
    
    	if (LOWORD(lParam) == atomApp && HIWORD(lParam) == atomTopic) {
    		hwndClientDDE = (HWND)wParam;
    		// デッドロックにならない?
    		SendMessage(hwndClientDDE, WM_DDE_ACK, (WPARAM)hwnd, MAKELONG(atomApp, atomTopic));
    	}
    
    	GlobalDeleteAtom(atomTopic);
    	GlobalDeleteAtom(atomApp);
    	
    	return 0;
    }
    
    0 件のコメント コメントはありません

  2. otaky 120 評価のポイント
    2024-07-26T04:44:34.16+00:00

    ※DDEを勉強していくうえで、メッセージデッドロックが気になりました。

    >SendMessage API は別スレッド(別プロセス上のスレッドを含む)のウィンドウを呼び出した場合は>再入可能な状態で待機します。そのため、別スレッドからSendMessageされてきた場合は再入でき>る形で待機しています。

    お互いが待機している状態となるので、デッドロックになると思ったのですが、解釈が違いますか?


お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。