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

VC 建立桌面捷徑完整實作碼

     編輯:關於VC++

在 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;
}

關鍵技術點解析

  1. COM 初始化/清理:CoInitialize/CoUninitialize 配對呼叫
  2. 桌面路徑取得:SHGetSpecialFolderLocation(CSIDL_DESKTOPDIRECTORY) → SHGetPathFromIDList
  3. Shell Link 建立:CoCreateInstance(CLSID_ShellLink) → IShellLink 介面
  4. 關鍵屬性設定:
    • SetPath:目標執行檔完整路徑
    • SetWorkingDirectory:必須設定,否則相對路徑資源載入失敗
    • 可選:SetDescription、SetIconLocation、SetArguments
  5. 持久化儲存:IPersistFile::Save 寫入 .lnk 檔案
  6. 記憶體管理:pidl、COM 介面指標皆需正確 Release/Free

常見坑點提醒

  • 目標路徑含空格需雙引號包裹
  • Unicode 專案使用 CString/_T() 巨集確保字串正確
  • Vista+ 系統需注意 UAC 權限,桌面公共區域 CSIDL_COMMON_DESKTOPDIRECTORY 可能需要管理員權限
  • 捷徑圖標預設取自目標執行檔,可用 SetIconLocation 自訂

呼叫範例

CString exePath = _T("C:\\MyApp\\");
CreateDesktopShotCut(_T("我的應用程式"), exePath);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved