采用COM方法 创建应用程序的快捷方式(菜鸟版)

本文介绍了一个使用C++创建快捷方式的示例程序,并列举了编译过程中可能出现的错误及其解决方法。示例展示了如何通过调用COM接口来创建指向特定应用程序的快捷方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请标明是引用于 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.libdebug)或者atls.lib。有两种方式:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值