转载请标明是引用于 http://blog.youkuaiyun.com/chenyujing1234
通过此例子学习创建快捷方式的方法,也可知道一些编译错误的解决方法。
#include <windows.h>
#include <dbt.h>
#include <streams.h>
#include <mmreg.h>
#include <msacm.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <shlobj.h>
#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, // 聚合用(注)
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 字符串 CONVERSION要慎用
ppf->Save(T2COLE(lpszLnk), TRUE ); // 保存
}
}
if ( ppf )
ppf->Release();
if ( psl )
psl->Release();
::CoUninitialize();
}
int main()
{
CreateShortcut(
("C:\\WINDOWS\\system32\\notepad.exe"), // 记事本程序。注意,你的系统是否也是这个目录?
("c:\\Documents and Settings\\Administrator\\桌面\\我的记事本.lnk")
);
return 0;
}
error C2065: “IShellLink”: 未声明的标识符
解决方法是添加
#include <shlobj.h>
error C2065: “USES_CONVERSION”: 未声明的标识符
解决方法是添加
#include "atlconv.h"
提示:
error LNK2001: 无法解析的外部符号 "unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)" (?g_pfnGetThreadACP@ATL@@3P6GIXZA)
解决方法是
包含atlsd.lib(debug)或者atls.lib。有两种方式: