首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 使用 DDE 與程式管理器互動:動態建立/刪除程式群組與項目

     編輯:關於VC++

Windows 3.x/9x 時代的程式管理器 透過 DDE (Dynamic Data Exchange) 接受外部應用程式建立群組、新增/移除項目等命令。雖然現代 Windows 已改用捷徑/登錄機制,但理解 DDE 協定與 ddeml.h API 有助於維護舊系統或實作特定自動化需求。本文提供完整 MFC 範例,示範如何初始化 DDE、連線 PROGMAN、發送命令字串建立群組與項目。

一、DDE 初始化與結束

應用程式類別成員

class CPMGROUPApp : public CWinApp {
  DWORD m_dwDDEInst; // DDE 實例代碼
public:
  virtual BOOL InitInstance();
  virtual int ExitInstance();
  int AddPMGroup(CString& group, CString& item, CString& file);
};

InitInstance:初始化 DDEML


BOOL CPMGROUPApp::InitInstance() {
  // ... 標準初始化 ...
  UINT cb = DdeInitialize(&m_dwDDEInst, NULL, APPCMD_CLIENTONLY, 0);
  if (cb != DMLERR_NO_ERROR) {
    AfxMessageBox(_T("DDE 初始化失敗"));
    return FALSE;
  }

  // 假設對話方塊取得使用者輸入
  CPMGROUPDlg dlg;
  if (dlg.DoModal() == IDOK) {
    if (!AddPMGroup(dlg.m_GroupName, dlg.m_ItemName, dlg.m_FileName)) {
      AfxMessageBox(_T("DDE 錯誤:無法建立群組/項目"));
    }
  }
  return TRUE;
}

ExitInstance:釋放 DDE


int CPMGROUPApp::ExitInstance() {
  DdeUninitialize(m_dwDDEInst);
  return CWinApp::ExitInstance();
}

二、發送 DDE 命令建立群組與項目


int CPMGROUPApp::AddPMGroup(CString& group, CString& item, CString& file) {
  // 1. 建立服務/主題字串控制代碼 (Service="PROGMAN", Topic="PROGMAN")
  HSZ hszService = DdeCreateStringHandle(m_dwDDEInst, _T("PROGMAN"), CP_WINANSI);
  HSZ hszTopic   = DdeCreateStringHandle(m_dwDDEInst, _T("PROGMAN"), CP_WINANSI);

  // 2. 建立會話
  HCONV hConv = DdeConnect(m_dwDDEInst, hszTopic, hszService, NULL);
  DdeFreeStringHandle(m_dwDDEInst, hszService);
  DdeFreeStringHandle(m_dwDDEInst, hszTopic);
  if (!hConv) return FALSE;

  // 3. 發送建立群組命令: [CreateGroup(群組名)]
  CString cmd = _T("[CreateGroup(") + group + _T(")]");
  DWORD dwResult;
  DdeClientTransaction(
    (LPBYTE)(LPCTSTR)cmd, cmd.GetLength() + 1, // 含結束 null
    hConv, NULL, CF_TEXT, XTYP_EXECUTE,
    1000, &dwResult);

  // 4. 發送新增項目命令: [AddItem(執行檔路徑,項目標題)]
  cmd = _T("[AddItem(") + file + _T(",") + item + _T(")]");
  DdeClientTransaction(
    (LPBYTE)(LPCTSTR)cmd, cmd.GetLength() + 1,
    hConv, NULL, CF_TEXT, XTYP_EXECUTE,
    1000, &dwResult);

  // 5. 斷開會話
  DdeDisconnect(hConv);
  return TRUE;
}

三、PROGMAN 支援的其他 DDE 命令

命令格式功能
[ShowGroup(群組名,1)]顯示並啟動指定群組視窗
[DeleteGroup(群組名)]刪除整個群組
[ReloadGroup(群組名)]重新載入群組 (更新項目)
[AddItem(路徑,標題)]新增項目 (建立捷徑)
[ReplaceItem(標題)]取代現有項目
[DeleteItem(標題)]刪除項目
[ExitProgMan(1)]退出程式管理器 (1=儲存設定)

四、完整專案建立步驟

  1. MFC AppWizard 建立對話方塊專案 PMGROUP。
  2. 對話方塊放置三個 Edit Control:群組名 (IDC_GROUP)、項目名 (IDC_ITEM)、檔案路徑 (IDC_FILE),關聯 CString 成員變數。
  3. stdafx.h 加入 #include <ddeml.h>。
  4. 專案設定 → Link → General → Object/Library Modules 加入 user32.lib (DDEML 位於 user32.dll)。
  5. 於 CPMGROUPApp 加入 m_dwDDEInst、AddPMGroup、InitInstance/ExitInstance 覆寫。
  6. 編譯執行,輸入資料點擊確定,查看程式管理器是否出現新群組與項目。

五、注意事項

  • Windows 2000/XP 以上程式管理器已被「開始功能表」取代,DDE 命令可能無效或行為不同。
  • 現代部署應使用 IShellLink、SHCreateShortcut、登錄表 Run 等機制建立捷徑。
  • DDE 為同步阻塞呼叫,若 PROGMAN 未回應會導致 UI 凍結,建議放入背景執行緒。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved