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

在快速啟動列建立捷徑:C++ 實作 IShellLink 介面完整範例

     編輯:關於C++

核心資料結構


#define NO_WIN32_LEAN_AND_MEAN
#include 
#include 

struct TShortcutCfg {
    TShortcutCfg() {
        nShowCmd = SW_SHOWNORMAL;
        wHotKey = 0;
        nIconIndex = 0;
    }
    
    AnsiString strShortcutName;  // 捷徑名稱
    AnsiString strLnkDir;        // 捷徑目錄 (快速啟動列路徑)
    AnsiString strDestFile;      // 目標執行檔路徑
    AnsiString strArguments;     // 命令列參數
    AnsiString strIconFile;      // 圖示檔案路徑
    int nIconIndex;              // 圖示索引
    AnsiString strWorkingDir;    // 工作目錄
    AnsiString strDescription;   // 工具提示描述
    WORD wHotKey;                // 熱鍵
    int nShowCmd;                // 視窗顯示狀態
};

建立快速啟動捷徑核心函數


bool CreateQuickLaunchShortcut(TShortcutCfg *scConfig) {
    char szBuf[MAX_PATH];
    bool bReturn = true;
    wchar_t wszBuf[MAX_PATH];
    IShellLink *pShellLink;
    AnsiString strShortcutFile;
    LPITEMIDLIST lpItemIdList;
    
    // 1. 取得 Application Data 目錄 (CSIDL_APPDATA)
    SHGetSpecialFolderLocation(0, CSIDL_APPDATA, &lpItemIdList);
    SHGetPathFromIDList(lpItemIdList, szBuf);
    
    if (DirectoryExists(AnsiString(szBuf))) {
        // 快速啟動列路徑: %APPDATA%\Microsoft\Internet Explorer\Quick Launch\
        strShortcutFile = AnsiString(szBuf) 
            + "\\Microsoft\\Internet Explorer\\Quick Launch\\" 
            + scConfig->strShortcutName + ".lnk";
        strShortcutFile.WideChar(wszBuf, MAX_PATH);
    } else {
        bReturn = false;
    }
    
    // 2. 建立 ShellLink COM 物件
    if (bReturn) {
        bReturn = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
            IID_IShellLink, (void**)&pShellLink) >= 0;
    }
    
    // 3. 取得 IPersistFile 介面以儲存捷徑檔
    if (bReturn) {
        IPersistFile *ppf;
        bReturn = pShellLink->QueryInterface(IID_IPersistFile, (void**)&ppf) >= 0;
        
        if (bReturn) {
            // 設定目標檔案
            if (scConfig->strDestFile != EmptyStr)
                bReturn = pShellLink->SetPath(scConfig->strDestFile.c_str()) >= 0;
            
            // 設定參數
            if (bReturn && scConfig->strArguments != EmptyStr)
                bReturn = pShellLink->SetArguments(scConfig->strArguments.c_str()) >= 0;
            
            // 設定圖示
            if (bReturn && scConfig->strIconFile != EmptyStr && FileExists(scConfig->strIconFile))
                pShellLink->SetIconLocation(scConfig->strIconFile.c_str(), scConfig->nIconIndex);
            
            // 設定工作目錄
            if (bReturn && scConfig->strWorkingDir != EmptyStr)
                pShellLink->SetWorkingDirectory(scConfig->strWorkingDir.c_str());
            
            // 設定描述 (工具提示)
            if (bReturn && scConfig->strDescription != EmptyStr)
                pShellLink->SetDescription(scConfig->strDescription.c_str());
            
            // 設定熱鍵
            if (bReturn && scConfig->wHotKey != 0)
                pShellLink->SetHotkey(scConfig->wHotKey);
            
            // 設定視窗顯示狀態
            if (bReturn && scConfig->nShowCmd != 0)
                pShellLink->SetShowCmd(scConfig->nShowCmd);
            
            // 儲存捷徑檔
            if (bReturn)
                bReturn = (ppf->Save(wszBuf, TRUE) >= 0);
            
            ppf->Release();
        }
        pShellLink->Release();
    }
    
    return bReturn;
}

呼叫範例


void __fastcall TForm1::Button1Click(TObject *Sender) {
    TShortcutCfg scShortcut;
    scShortcut.strDestFile = "C:\\123\\123.exe";
    scShortcut.strShortcutName = "test";
    
    if (CreateQuickLaunchShortcut(&scShortcut))
        ShowMessage("在快速啟動欄建立捷徑成功!");
}

關鍵技術點解析

  1. CSIDL_APPDATA:取得目前使用者應用程式資料目錄,快速啟動列位於其子目錄下
  2. IShellLink 介面:COM 標準介面,提供捷徑屬性設定方法
  3. IPersistFile 介面:將捷徑物件持久化為 .lnk 檔案
  4. WideChar 轉換:Save() 方法需 Unicode 路徑
  5. 錯誤處理:每步驟檢查 HRESULT,失敗即釋放介面並返回 false

擴充應用

同樣原理可用於建立桌面捷徑、開始選單捷徑,只需修改 SHGetSpecialFolderLocation 的 CSIDL 參數 (如 CSIDL_DESKTOPDIRECTORY、CSIDL_STARTMENU)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved