在桌面建立快捷方式

轉自: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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章