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_POINTER | pszOut缓冲区太小 |
S_FALSE | pszOut是NULL,pcchOut得到了需要的缓冲区大小 |
参考资料:
[微软官方文档]https://docs.microsoft.com/zh-cn/windows/win32/api/shlwapi/nf-shlwapi-assocquerystringa