轉自:http://www.vckbase.com
在閱讀代碼之前,先看一下關於“快捷方式”組件的結構示意圖。
圖二、快捷方式組件的接口結構示意圖
從結構圖中可以看出,“快捷方式”組件(CLSID_ShellLink),有3個(其實不止)接口,每個接口完成一組相關功能的函數。IShellLink 接口(IID_IShellLink)提供快捷方式的參數讀寫功能(見圖三),IPersistFile 接口(IID_IPersistFile)提供快捷方式持續性文件的讀寫功能。對象的持續性(注5),是一個非常常用,並且功能強大的接口家族。但今天,我們只要瞭解其中兩函數,就可以了:IPersistFile::Save()和IPersistFile:Load()。(注6)
圖三、快捷方式中的各種屬性
#include < atlconv.h > void CreateShortcut(LPCTSTR lpszExe, LPCTSTR lpszLnk) { // 建立塊捷方式 // 參數 lpszExe: EXE 文件全路徑名 // 參數 lpszLnk: 快捷方式文件全路徑名 ::CoInitialize( NULL ); IShellLink * psl = NULL; IPersistFile * ppf = NULL; HRESULT hr = ::CoCreateInstance( // 啓動組件 CLSID_ShellLink, // 快捷方式 CLSID NULL, // 聚合用(注4) CLSCTX_INPROC_SERVER, // 進程內(Shell32.dll)服務 IID_IShellLink, // IShellLink 的 IID (LPVOID *)&psl ); // 得到接口指針 if ( SUCCEEDED(hr) ) { psl->SetPath( lpszExe ); // 全路徑程序名 // psl->SetArguments(); // 命令行參數 // psl->SetDescription(); // 備註 // psl->SetHotkey(); // 快捷鍵 // psl->SetIconLocation(); // 圖標 // psl->SetShowCmd(); // 窗口尺寸 // 根據 EXE 的文件名,得到目錄名 TCHAR szWorkPath[ MAX_PATH ]; ::lstrcpy( szWorkPath, lpszExe ); LPTSTR lp = szWorkPath; while( *lp ) lp++; while( ''//'' != *lp ) lp--; *lp=0; // 設置 EXE 程序的默認工作目錄 psl->SetWorkingDirectory( szWorkPath ); hr = psl->QueryInterface( // 查找持續性文件接口指針 IID_IPersistFile, // 持續性接口 IID (LPVOID *)&ppf ); // 得到接口指針 if ( SUCCEEDED(hr) ) { USES_CONVERSION; // 轉換爲 UNICODE 字符串 ppf->Save( T2COLE( lpszLnk ), TRUE ); // 保存 } } if ( ppf ) ppf->Release(); if ( psl ) psl->Release(); ::CoUninitialize(); } void OnXXX() { CreateShortcut( _T("c://winnt//notepad.exe"), // 記事本程序。注意,你的系統是否也是這個目錄? _T("c://Documents and Settings//Administrator//桌面//我的記事本.lnk") ); // 桌面上建立快捷方式(lnk)文件的全路徑名。注意,你的系統是否也是這個目錄? // 如果用程序實現尋找桌面的路徑,則可以查註冊表 // HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Folders }