在 VC/MFC 專案中程式化建立桌面捷徑,核心使用 Shell 介面 IShellLink 與 SHGetSpecialFolderLocation 取得桌面路徑。
BOOL CDlg::CreateDesktopShotCut(CString strName, CString strSourcePath) {
if (FAILED(CoInitialize(NULL))) return FALSE;
BOOL bRet = FALSE;
TCHAR Path[MAX_PATH + 1];
CString strDestDir;
LPITEMIDLIST pidl;
LPMALLOC pShell;
if (SUCCEEDED(SHGetMalloc(&pShell))) {
if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &pidl))) {
if (!SHGetPathFromIDList(pidl, Path)) {
pShell->Free(pidl);
}
pShell->Release();
strDestDir.Format(_T("%s"), Path);
strDestDir += _T("\\");
strDestDir += strName; // 捷徑名稱
strDestDir += _T(".lnk"); // 副檔名
IShellLink* psl;
if (SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl))) {
psl->SetPath(strSourcePath + _T("Player.exe")); // 目標程式
// 重要:起始目錄應設為目標程式所在目錄,否則可能導致不可預期錯誤
psl->SetWorkingDirectory(strSourcePath); // 設定起始位置
IPersistFile* ppf;
if (SUCCEEDED(psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf))) {
if (SUCCEEDED(ppf->Save(strDestDir, TRUE))) // 儲存捷徑
bRet = TRUE;
ppf->Release();
}
psl->Release();
}
}
}
CoUninitialize();
return bRet;
}
CoInitialize/CoUninitialize 配對呼叫SHGetSpecialFolderLocation(CSIDL_DESKTOPDIRECTORY) → SHGetPathFromIDListCoCreateInstance(CLSID_ShellLink) → IShellLink 介面SetPath:目標執行檔完整路徑SetWorkingDirectory:必須設定,否則相對路徑資源載入失敗SetDescription、SetIconLocation、SetArgumentsIPersistFile::Save 寫入 .lnk 檔案pidl、COM 介面指標皆需正確 Release/FreeCString/_T() 巨集確保字串正確CSIDL_COMMON_DESKTOPDIRECTORY 可能需要管理員權限SetIconLocation 自訂CString exePath = _T("C:\\MyApp\\");
CreateDesktopShotCut(_T("我的應用程式"), exePath);