使用IShellLink和IPersistFile在windows下创建文件快捷方式

10 篇文章 0 订阅

转载:http://www.cnblogs.com/lzjsky/archive/2011/01/17/1937525.html

二个操作:新建和解析
主要用到的是COM组件。IShellLink和IPersistFile
需要添加的头函数

#include <shobjidl.h>

IPersistFile主要用到两个成员函数:
1、Save。保存内容到文件中去
2、Load。读取
Load的函数原型
HRESULT Load(
LPCOLSTR pszFileName, //快捷方式的文件名,应该是ANSI字符
DWORD dwMode //读取方式
);
dwMode可取如下值:
STGM_READ:只读
STGM_WRITE:只写
STGM_READWRITE:读写
IShellLink主要成员:
1、GetArguments:获得参数信息
2、GetDescription:获得描述信息(备注行)
3、GetHotkey:获得快捷键
4、GetIconLocation:获得图标
5、GetIDList:获得快捷方式的目标对象的item identifier list (Windows外壳中的每个对象如文件,目录和打印机等都有唯一的item identifiler list)
6、GetPath: 获得快捷方式的目标文件或目录的全路径
7、GetShowCmd:获得快捷方式的运行方式,比如常规窗口,最大化
8、GetWorkingDirectory:获得工作目录
9、Resolve:按照一定的搜索规则试图获得目标对象,即使目标对象已经被删除或移动,重命名
下面是对应信息的设置方法
10、SetArguments
11、SetDescription
12、SetHotkey
13、SetIconLocation
14、SetIDList
15、SetPath
16、SetRelativePat
17、SetShowCmd
18、SetWorkingDirectory
一般情况操作如下:
一、初始化COM接口
二、创建IShellLink对象
三、从IShellLink对象中获取IPersistFile对象接口
四、操作IShellLink对象
五、释放IPersistFile对象接口
六、释放IShellLink对象
七、释放COM接口

示例一:

bool MyFile::myCreateShortcut(const std::string srcfilePath, const std::string shortcutPath)
{
	assert(srcfilePath.size() != 0 && shortcutPath.size() != 0);

	CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
	//获取文件名
	size_t begin = (srcfilePath.find_last_of('\\')) + 1;
	size_t end = srcfilePath.find_last_of('.');
	std::string tmp;
	while (begin != end)
	{
		tmp += srcfilePath[begin];
		begin++;
	}
	tmp += ".lnk";

	tmp = shortcutPath + tmp;

	IShellLink *psl;
	char szPath[MAX_PATH]{ 0 }; //c++11特性,使用初始化列表初始化
	memcpy(szPath, tmp.c_str(), MAX_PATH);
	
	printf("%s\n", szPath);


	HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&psl));
	if (SUCCEEDED(hr)) {
		psl->SetPath(TEXT(srcfilePath.c_str()));//设置快捷方式的目标文件

		IPersistFile *ppf;
		hr = psl->QueryInterface(&ppf);
		if (SUCCEEDED(hr)) {

			USES_CONVERSION;
			LPCOLESTR lpOleStr = A2COLE(szPath);
			hr = ppf->Save(lpOleStr, TRUE);//保存快捷方式
			if (SUCCEEDED(hr)) {
				std::cout << TEXT("创建文件快捷方式成功!") << std::endl;
			}
			else
				std::cout << TEXT("创建快捷方式失败!") << std::endl;

			psl->Release();
		}
		else
			std::cout << TEXT("操作失败!\n") << std::endl;
	}
	return true;
}

示例二:

示例代码:
/*
注:在桌面上创建快捷方式,快捷方式的名称为"VC创建的快捷方式",快捷方式指向应用程序"c:\aa.exe"
快捷方式的快捷键:无
快捷方式的工作目录:c:\
快捷方式的备注:VC写写捷方式
快捷方式的运行方式:常规窗口
*/
HRESULT hRet;
IShellLink *pLink;  //IShellLink对象指针
IPersistFile * ppf; //IPersisFil对象指针
WCHAR wsz[MAX_PATH];  //定义Unicode字符串
//初始化COM库
hRet = ::CoInitialize(NULL);
if ( hRet != S_OK)  //初始化COM库失败,直接返回
{
   AfxMessageBox("初始化COM库失败");
   return;
}
//创建IShellLink实例
hRet = ::CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&pLink);
if ( hRet != S_ok)
{
 AfxMessageBox("创建IShellLink实例失败");
}
else
{
 //创建IShellLink实例成功,继续操作
 
 //从IShellLink对象中获取IPersistFile接口
 hRet = pLink->QueryInterface(IID_IpersistFile,(void**)&ppf);
 if ( hRet != S_OK)
 {
  AfxMessageBox("获取IPersistFile接口失败");
 }
 else
 {
  //获取接口成功,继续操作
  //设置快捷方式中的程序路径
  pLink->SetPath("c:\\aa.exe");
  //设置快捷方式的工作目录
  pLink->SetWorkingDirectory("c:\\");
  //确保快捷方式路径由ANSI字符串组成
  MultiByteToWideChar(
   CP_ACP,
   0,
   "C:\\Documents and Settings\\hjs\\桌面\\vc创建的快捷方式.lnk",
   -1,
   wsz,
   MAX_PATH
  );
  //保存快捷方式
  ppf->Save(wsz,TRUE);
 }
}
//释放IPersistFile接口
ppf->Release();
//释放IShellLink对象
pLink->Release();
//释放COM接口
::CoUninitialize();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下代码在C++中创建文件夹和桌面快捷方式: ```cpp #include <iostream> #include <windows.h> #include <shlobj.h> int main() { // 创建文件夹 std::string folderPath = "C:\\path\\to\\folder"; if (!CreateDirectory(folderPath.c_str(), NULL)) { std::cout << "无法创建文件夹!" << std::endl; return 1; } // 创建桌面快捷方式 std::string desktopPath; HRESULT result = SHGetFolderPathA(NULL, CSIDL_DESKTOPDIRECTORY, NULL, 0, desktopPath); if (result != S_OK) { std::cout << "无法获取桌面路径!" << std::endl; return 1; } std::string shortcutPath = desktopPath + "\\MyFolderShortcut.lnk"; result = CoInitialize(NULL); if (result != S_OK) { std::cout << "无法初始化COM库!" << std::endl; return 1; } IShellLink* pShellLink; result = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&pShellLink); if (result != S_OK) { std::cout << "无法创建Shell链接实例!" << std::endl; CoUninitialize(); return 1; } pShellLink->SetPath(folderPath.c_str()); pShellLink->SetDescription("My Folder Shortcut"); IPersistFile* pPersistFile; result = pShellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&pPersistFile); if (result != S_OK) { std::cout << "无法获取IPersistFile接口!" << std::endl; pShellLink->Release(); CoUninitialize(); return 1; } result = pPersistFile->Save(shortcutPath.c_str(), TRUE); if (result != S_OK) { std::cout << "无法保存快捷方式!" << std::endl; pPersistFile->Release(); pShellLink->Release(); CoUninitialize(); return 1; } pPersistFile->Release(); pShellLink->Release(); CoUninitialize(); std::cout << "文件夹和桌面快捷方式创建成功!" << std::endl; return 0; } ``` 请确保将 `C:\path\to\folder` 替换为您要创建文件夹的实际路径。这段代码使用Windows API来创建文件夹和桌面快捷方式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值