Windows 3.x/9x 時代的程式管理器 透過 DDE (Dynamic Data Exchange) 接受外部應用程式建立群組、新增/移除項目等命令。雖然現代 Windows 已改用捷徑/登錄機制,但理解 DDE 協定與 ddeml.h API 有助於維護舊系統或實作特定自動化需求。本文提供完整 MFC 範例,示範如何初始化 DDE、連線 PROGMAN、發送命令字串建立群組與項目。
class CPMGROUPApp : public CWinApp {
DWORD m_dwDDEInst; // DDE 實例代碼
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
int AddPMGroup(CString& group, CString& item, CString& file);
};
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;
}
int CPMGROUPApp::ExitInstance() {
DdeUninitialize(m_dwDDEInst);
return CWinApp::ExitInstance();
}
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;
}
| 命令格式 | 功能 |
|---|---|
[ShowGroup(群組名,1)] | 顯示並啟動指定群組視窗 |
[DeleteGroup(群組名)] | 刪除整個群組 |
[ReloadGroup(群組名)] | 重新載入群組 (更新項目) |
[AddItem(路徑,標題)] | 新增項目 (建立捷徑) |
[ReplaceItem(標題)] | 取代現有項目 |
[DeleteItem(標題)] | 刪除項目 |
[ExitProgMan(1)] | 退出程式管理器 (1=儲存設定) |
PMGROUP。CString 成員變數。stdafx.h 加入 #include <ddeml.h>。user32.lib (DDEML 位於 user32.dll)。CPMGROUPApp 加入 m_dwDDEInst、AddPMGroup、InitInstance/ExitInstance 覆寫。IShellLink、SHCreateShortcut、登錄表 Run 等機制建立捷徑。