如何在程序中创建快捷方式?
这里给出一个创建快捷方式的例子,是使用IShellLink和IPersistFile两个COM接口实现的。
例子代码如下:
CFileDialog openDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER );
if (IDCANCEL==openDlg.DoModal())
{
return;
}
CString csFile, csFileLnk, csDirectory;
csFile = openDlg.GetPathName();
csFileLnk = csFile.Left(csFile.GetLength()-openDlg.GetFileExt().GetLength()-1);
csFileLnk += _T(".lnk");
csDirectory = csFile.Left(csFile.GetLength()-openDlg.GetFileName().GetLength());
HRESULT hres=NULL;
IShellLink* psl;
// Get a pointer to the IShellLink interface.
hres = CoInitialize(NULL);
if (!SUCCEEDED(hres))
{
AfxMessageBox(_T("COM initialized failed."));
return;
}
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
if (!SUCCEEDED(hres))
{
AfxMessageBox(_T("Create instance failed."));
CoUninitialize();
return;
}
psl->SetDescription(_T("测试快捷方式"));
psl->SetIconLocation(csFile, 0);
psl->SetPath(csFile);
psl->SetShowCmd(SW_SHOWNORMAL);
psl->SetWorkingDirectory(csDirectory);
IPersistFile* ppf;
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (!SUCCEEDED(hres))
{
AfxMessageBox(_T("Query interface failed."));
CoUninitialize();
return;
}
WCHAR wsz[MAX_PATH];
MultiByteToWideChar(CP_ACP,
0,
_T(csFileLnk),
-1,
wsz,
MAX_PATH);
hres = ppf->Save(wsz, FALSE);
if (!SUCCEEDED(hres))
{
AfxMessageBox(_T("Save failed."));
}
ppf->Release();
psl->Release();
CoUninitialize();
AfxMessageBox(_T("创建成功!"));
-------------------------------------------------Other------------------------------------------------------
void CCsdn9Dlg::OnOK() { // TODO: Add extra validation here //CreateStreamOnHGlobal //IPicture::Save LPBYTE lpBits=NULL; long size=0; HICON hicon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1)); PICTDESC pdiconsrc; pdiconsrc.cbSizeofstruct=sizeof(PICTDESC); pdiconsrc.icon.hicon=hicon; pdiconsrc.picType=PICTYPE_ICON; IPicture* pIPicture=NULL; HRESULT hr; IDispatch* pDisp=NULL; hr = OleCreatePictureIndirect(&pdiconsrc, IID_IDispatch, TRUE, (void**)&pDisp); if(SUCCEEDED(hr)) { hr = pDisp->QueryInterface(&pIPicture); if(SUCCEEDED(hr)) { lpBits = (LPBYTE) GlobalAlloc(GMEM_MOVEABLE|GMEM_NODISCARD, 64*1024); IStream* pStream; CreateStreamOnHGlobal(lpBits,false,&pStream); hr=pIPicture->SaveAsFile(pStream,false,&size); if(pStream) pStream->Release(); if(SUCCEEDED(hr)&&size>0) { //you can use char* pchar=(char*)lpBits; //icon is stored in pchar, length is size //to create another hicon //use OleLoadPicture(pStream,...) //IPicture::get_Handle to get the icon handle } pIPicture->Release(); if(lpBits) GlobalFree((HGLOBAL)lpBits); } pDisp->Release(); } } void SaveIcon(HICON hIconToSave, LPCTSTR sIconFileName) { if(hIconToSave==NULL || sIconFileName==NULL) return; //warning: this code snippet is not bullet proof. //do error check by yourself [masterz] PICTDESC picdesc; picdesc.cbSizeofstruct = sizeof(PICTDESC); picdesc.picType = PICTYPE_ICON ; picdesc.icon.hicon = hIconToSave; IPicture* pPicture=NULL; OleCreatePictureIndirect(&picdesc, IID_IPicture, TRUE,(VOID**)&pPicture); LPSTREAM pStream; CreateStreamOnHGlobal(NULL,TRUE,&pStream); LONG size; HRESULT hr=pPicture->SaveAsFile(pStream,TRUE,&size); char pathbuf[1024]; strcpy(pathbuf,sIconFileName); CFile iconfile; iconfile.Open(pathbuf, CFile::modeCreate|CFile::modeWrite); LARGE_INTEGER li; li.HighPart =0; li.LowPart =0; ULARGE_INTEGER ulnewpos; pStream->Seek( li,STREAM_SEEK_SET,&ulnewpos); ULONG uReadCount = 1; while(uReadCount>0) { pStream->Read(pathbuf,sizeof(pathbuf),&uReadCount); if(uReadCount>0) iconfile.Write(pathbuf,uReadCount); } pStream->Release(); iconfile.Close(); }
如何在程序中创建快捷方式?相关推荐
- 如何在程序中创建快捷方式
通过手工操作建立这些菜单项或快捷方式并不复杂,在一般Windows使用手册中都有介绍,相信大家都很熟悉,在此不再赘述.笔者在有关资料的基础上,通过实践摸索,找到了在应用程序中完成上述工作的方法.这正是 ...
- 在Win32程序中创建OpenGL渲染环境
在Win32程序中创建OpenGL渲染环境 创建opengl渲染环境步骤: 选定像素格式 //WinMain()HDC dc = GetDC(hwnd);PIXELFORMATDESCRIPTOR p ...
- 如何使用Angular Router在Angular 9应用程序中创建导航
This article will demonstrate the proper way to create page navigation leveraging routing features p ...
- 如何在桌面或者开始菜单中创建快捷方式
//在桌面或者开始菜单中创建快捷方式 //pazSrcPath:源文件路径 //bDesktop:标志位,用来判断是否在桌面上创建快捷方式,真,在桌面上创建,否则在开始菜单中创建 bool creat ...
- Java实现pdf转tex_使用Free Spire.PDF在Java程序中创建和转换PDF文件
在这篇文章中,我将举例说明如何创建一个包含标题,段落,图像,编号列表和表格的简单的PDF文件,以及如何使用Free Spire.PDF将PDF转换为其他文件格式. 概述 Free Spire.PDF ...
- 在Java程序中创建和转换PDF文件
点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 作者: Codingqi123 来源: jianshu.com/p/db15232987 ...
- 微信小程序怎么新建php文件,微信小程序中创建小程序页面的步骤介绍(图文)...
本篇文章给大家带来的内容是关于微信小程序之创建小程序页面的步骤介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 创建一个简单的页面,创建小程序页面的具体几个步骤: 1. 在page ...
- java控件数组_在C# WinForm程序中创建控件数组及相应的事件处理
控件数组是VB提供的一个优秀的设计解决方案,它能很方便快捷的处理大批同类控件的响应和时间处理,但不知为什么在C#中这个优秀特性没有传承下来,甚为可惜,本文将要探讨就是如何在C# WinForm程序实现 ...
- ipad原始邮箱服务器端口,如何在iPhone/iPad/iPod touch邮件应用程序中创建帐户(默认POP3)?...
下面向大家介绍如何使用iPhone/iPad/iPod touch上的邮件应用程序Mail创建 yeah 邮箱帐户,这里以iPod touch为例(iPhone/iPad中除了界面略有区别外,操作基本 ...
最新文章
- acer clear 工具_50个能帮你节省时间的开发工具!(值得收藏)-头条
- 像像接入云信,连接真人连接真爱
- POJ3450 Corporate Identity —— 后缀数组 最长公共子序列
- 阿里巴巴集团成为国家信息安全漏洞库(CNNVD)技术支撑单位
- c语言数码管加法程序怎么写,拜托大神写数码管与矩阵键盘结合设计简易计算器C语言的程序...
- 逆序对java_逆序对
- (转)C#开发微信门户及应用(6)--微信门户菜单的管理操作
- set/multiset容器
- java 文本词频统计_Java实现中文词频统计
- 打印服务Print Spooler自动停止解决方案
- 什么是c语言函数,C语言中的函数是什么意思
- glide 设置宽高_Android之ImageView加载图片保持宽高比
- PS 复制图层使用
- mac 打开网页慢_苹果笔记本打开网页很慢是什么原因
- 关于单体应用的简单讲解
- SVN服务端和客户端搭建教程
- Rust 引入其他的 rs 文件
- dbca -silent静默安装12c rac数据库
- 大牛程序员用Java手写JVM:刚好够运行 HelloWorld
- 【git-02】用git管理vue项目