利用AssocQueryString函数获取扩展名的关联程序路径

C++代码

代码中使用excel文档作为用例

	DWORD size = 0;
	HRESULT hr=::AssocQueryString(ASSOCF_NOFIXUPS|ASSOCF_VERIFY, ASSOCSTR_EXECUTABLE, _T(".xls"), NULL,NULL,&size);
	if(hr==S_FALSE)
	{
	char * buffer = new char[size];
	hr=::AssocQueryString(ASSOCF_NOFIXUPS| ASSOCF_VERIFY, ASSOCSTR_EXECUTABLE,  _T(".xls"), NULL,buffer,&size);
	if(hr==S_OK)
		std::cout<<buffer<<std::endl;
	delete[]buffer;
	}

在我电脑上的执行结果为:
在这里插入图片描述
注意如果没有默认的程序,则会返回系统的OpenWith.exe程序的路径。

使用AssocQuerySting函数需要包含以下头文件和静态库

#include<shlwapi.h>
#pragma comment(lib,"Shlwapi.lib")

AssocQueryString函数简介

LWSTDAPI AssocQueryStringA(
ASSOCF flags,
ASSOCSTR str,
LPCSTR pszAssoc,
LPCSTR pszExtra,
LPSTR pszOut,
DWORD *pcchOut
);
参数:
flags

类型:ASSOCF

可用于控制搜索的标志。它可以是ASSOCF值的任意组合,但只能包含一个ASSOCF_INIT值。

typedef enum {
ASSOCF_NONE = 0x00000000,
ASSOCF_INIT_NOREMAPCLSID = 0x00000001,
ASSOCF_INIT_BYEXENAME = 0x00000002,
ASSOCF_OPEN_BYEXENAME = 0x00000002,
ASSOCF_INIT_DEFAULTTOSTAR = 0x00000004,
ASSOCF_INIT_DEFAULTTOFOLDER = 0x00000008,
ASSOCF_NOUSERSETTINGS = 0x00000010,
ASSOCF_NOTRUNCATE = 0x00000020,
ASSOCF_VERIFY = 0x00000040,
ASSOCF_REMAPRUNDLL = 0x00000080,
ASSOCF_NOFIXUPS = 0x00000100,
ASSOCF_IGNOREBASECLASS = 0x00000200,
ASSOCF_INIT_IGNOREUNKNOWN = 0x00000400,
ASSOCF_INIT_FIXED_PROGID = 0x00000800,
ASSOCF_IS_PROTOCOL = 0x00001000,
ASSOCF_INIT_FOR_FILE = 0x00002000
} ASSOCF;

str

类型:ASSOCSTR

该ASSOCSTR值,指定字符串类型可以是下面的其中之一

typedef enum {
ASSOCSTR_COMMAND,
ASSOCSTR_EXECUTABLE,
ASSOCSTR_FRIENDLYDOCNAME,
ASSOCSTR_FRIENDLYAPPNAME,
ASSOCSTR_NOOPEN,
ASSOCSTR_SHELLNEWVALUE,
ASSOCSTR_DDECOMMAND,
ASSOCSTR_DDEIFEXEC,
ASSOCSTR_DDEAPPLICATION,
ASSOCSTR_DDETOPIC,
ASSOCSTR_INFOTIP,
ASSOCSTR_QUICKTIP,
ASSOCSTR_TILEINFO,
ASSOCSTR_CONTENTTYPE,
ASSOCSTR_DEFAULTICON,
ASSOCSTR_SHELLEXTENSION,
ASSOCSTR_DROPTARGET,
ASSOCSTR_DELEGATEEXECUTE,
ASSOCSTR_SUPPORTED_URI_PROTOCOLS,
ASSOCSTR_PROGID,
ASSOCSTR_APPID,
ASSOCSTR_APPPUBLISHER,
ASSOCSTR_APPICONREFERENCE,
ASSOCSTR_MAX
}

pszAssoc

类型:LPCTSTR
用于确定root key。可以使用以下四种类型的字符串。

文件扩展名
文件扩展名,例如.txt。

CLSID
标准“{GUID}”格式的CLSID GUID。

进程id

可执行文件名称
应用程序的.exe文件的名称。ASSOCF_OPEN_BYEXENAME标志必须设置。

pszExtra

类型:LPCTSTR

一个可选的以null结尾的字符串,其中包含有关字符串位置的其他信息。它通常设置为Shell动词,例如open。如果未使用此参数,请将此参数设置为NULL。

pszOut

类型:LPTSTR

指向以null结尾的字符串的指针,当此函数成功返回时,该字符串将接收请求的字符串。将此参数设置为NULL以检索所需的缓冲区大小。

pcchOut

类型:DWORD *

指向一个值的指针,该值在调用函数时设置为pszOut缓冲区中的字符数。当函数成功返回时,该值设置为实际放置在缓冲区中的字符数。

Return Value:

返回值含义
S_OK成功
E_POINTERpszOut缓冲区太小
S_FALSEpszOut是NULL,pcchOut得到了需要的缓冲区大小

参考资料:

[微软官方文档]https://docs.microsoft.com/zh-cn/windows/win32/api/shlwapi/nf-shlwapi-assocquerystringa

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值