本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[MSVC]MFCで作られたDDEサーバに二回以上コネクトできない

文書番号: 402002

最終更新日: 2003/11/10


この資料は以下の製品について記述したものです。


概要

この資料は MFC で作られた DDE サーバに二回以上コネクトできない問題とその回避方法 について説明したものです。

詳細

MFC のフレームワークを用いて作られたアプリケーションは EnableShellOpen 関数に よってシェルからの DDE コマンドをサポートしています。DDE クライアントは アプ リケーション名(サービス名)をプログラムの名前で指定して system トピックに
対して open の EXECUTE を実行することができます。しかし、MFC2.0 で作られた
アプリケーションは DDEML を使用して作られたクライアントから来る DdeConnect
を複数回受け付けることができません。

原因

これは MFC2.0 の問題です。CFrameWnd クラスの OnDDEInitiate で適切なアトムの取得 を行っていません。この問題はクライアントが DDEML の DdeConnect を使用してサー バに複数回の接続、切断を行ったときに起きる現象です。メッセージベースの DDE で はこの現象は発生しません。この問題は Visual C++ 1.5 に含まれる MFC 2.5 では
修正されています。

対処方法

この問題を回避するにはアプリケーションで使われる CFrameWnd のメンバ関数
OnDDEInitiate を適切にオーバーライドする必要があります。AppWizard で作られたプロ グラムであれば書き換えるモジュールは mainfrm.cpp, mainfrm.h です。

  //mainfrm.h
  class CMainFrame : public CMDIFrameWnd
  {
  //省略
  protected:
      afx_msg LRESULT OnDDEInitiate(WPARAM wParam, LPARAM lParam);
  }
  //mainfrm.cpp
  BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
      //{{AFX_MSG_MAP(CMainFrame)
      //}}AFX_MSG_MAP
      ON_MESSAGE(WM_DDE_INITIATE, OnDDEInitiate)
  END_MESSAGE_MAP()
  LRESULT CMainFrame::OnDDEInitiate(WPARAM wParam, LPARAM lParam)
  {
      CWinApp* pApp = AfxGetApp();
      if (LOWORD(lParam) != 0 && HIWORD(lParam) != 0 &&
        (ATOM)LOWORD(lParam) == pApp->m_atomApp &&
        (ATOM)HIWORD(lParam) == pApp->m_atomSystemTopic)
      {
      // 重複するアトムを作成
          char szAtomName[_MAX_PATH];
          VERIFY(GlobalGetAtomName(pApp->m_atomApp,
              szAtomName, sizeof szAtomName) != 0);
          VERIFY(GlobalAddAtom(szAtomName) == pApp->m_atomApp);
          VERIFY(GlobalGetAtomName(pApp->m_atomSystemTopic,
              szAtomName, sizeof szAtomName) != 0);
          VERIFY(GlobalAddAtom(szAtomName) == pApp->m_atomSystemTopic);
          // WM_DDE_ACK を送る(呼出側が重複したアトムを削除)
          ::SendMessage((HWND)wParam, WM_DDE_ACK, (WPARAM)m_hWnd,
              MAKELPARAM(pApp->m_atomApp, pApp->m_atomSystemTopic));
      }
      return 0L;
  }

Keywords: KBBUG VC10 VC15 KB402002
Technology: kbAudDeveloper kbVCsearch

inserted by FC2 system