您的位置:首页 > 其它

实现文件右键“打开方式”菜单功能(查看系统这种功能对比实现)

2011-04-29 15:58 776 查看
项目需要实现此功能,刚开始看这个功能的时候感觉很简单,想着肯定有一定的API函数能实现,没那么麻烦,可真正让我自己编码,去查找资料的时候我发觉对我有点困难,在此我想记录下我实现这个功能的步骤,寻找的资料 和方法。以供自己后续学习和进步

1.首先获取File关联的OpenWithList。。。

在网上查有关信息得到下面描述~~~

下面引用网站说法:::::::

最近因为的项目的原因,有一个机能要实现,什么机能呢?

其实很简单,得到一个文件的打开方式,也就是OpenWithList,当用户在一个文件上点击右键时,就会出现一个“打开方式”菜单项,英文中是”Open With”,我现在要做的就是取得这些打开方式列表。
我在网上调查了很久,没有找到一个很好的解决办法,我知道这些信息都存在于注册表中,而且我也知道存在哪里的,我写过一个程序来从注册表中取,行是行,但有效率问题,还有可能不准确,这方面的API也不多,还好,现在终于把这个问题解决了,完美解决,现在把它拿出来与大家分享一下。
用到的API和接口如下:
SHAssocEnumHandler,它可以得到一些接口的指针,其原型如下:
HRESULT SHAssocEnumHandlers(
LPCWSTR pszExtra,
ASSOC_FILTER afFilter,
IEnumAssocHandlers **ppEnumHandler);
具体的请参见MSDN,那么这个API就可以得到一个IEnumAssocHandlers类型的指针。我们再来看看IEnumAssocHandlers是什么东西。
IEnumAssocHandlers
Exposes a method that allows enumeration of a collection of handlers associated with particular file extensions(MSDN解释)
IEnumAssocHandlers
它提供了一个Next函数,用他就可以得到IAssocHandler 指针,IAssocHandler 这个接口就提供了取得打开方式列表的属性,如路径,图标,描述信息等。

以下是我写的代码:
WCHAR *pFileExt = L”.txt”; //扩展名
IEnumAssocHandlers *peah = NULL;
IAssocHandler *pah = NULL;
HRESULT hr = S_OK;
hr = SHAssocEnumHandlers(pFileExt, ASSOC_FILTER_RECOMMENDED, &peah);
if (SUCCEEDED(hr))
{
ULONG celtFetched = 0;
while(SUCCEEDED(peah->Next(1, &pah, &celtFetched)))
{
WCHAR *pFileName = NULL; // 文件路径
WCHAR *pFileDescription = NULL; // 文件描述,如Notepad.exe,就是记事本
if ( SUCCEEDED(pah->GetName(&pFileName))
&& SUCCEEDED(pah->GetUIName(&pFileDescription)) )
{
// 这里循环取得打开方式列表,你可以用一个数据把其存放起来
// To do what you want
}
pah->Release();
}
peah->Release();
}
注意
1.此处peah->Next(1, &pah, &celtFetched)的第一个参数要传1,因为每次取一个,用一个循环来处理,每次取一个,直到取完,我之前传的就不是1,结果取得的IAssocHandler指针它包含了多个Handler,所以就不能正确释放资源,就会出问题,因此Next的第一个参数要传1。
2.这些API和接口是Vista的,所以在XP上我不能保证能正常运行。
3.头文件shobjidl.h是需要的,如果头文件也加了,链接不过的话,把shell32.lib加入到工程中,如#param comment(“lib”, shell32.lib);

我的程序运行结果:





输入一个扩展名,如.txt,我利用程序可以得以得到它的关联打开方式的C:/Windows/notepad.exe,文件描述是“记事本”。
我这里只取了它的第一个文件,当然还可以取多个。
我这里还有一个功能,根据C:/Windows/notepad.exe路径,把它的图标提取出来。
具体做法,以后再写啦,就在不久的将来。

=============================================================================================
2.我用他的方法新建了个VC工程测试,尽管加了.h和lib 还是不管用的(我用的系统是Windows7),还是不行,结果我选择了从注册表中读取。。。

3.我用他的方法新建了个VC工程测试,尽管加了.h和lib 还是不管用的(我用的系统是Windows7),还是不行,结果我发现我本机的SDK中shobjidl.h并没有函数SHAssocEnumHandlers(),又上MSDN上查看这个函数,由经同事指点,我安装了Vista-SDK包,我在VC环境中Tools—Options-Directories中引入了我安装的Vista—Sdk路径(Include、Lib),用新安装SDK下Shobjidl.h替换了我旧的SDK,结果还是编译没通过。。。。。 后来又把这些代码拿在VS08(新建MFC工程)试了下,编译通过,它能完全的获取OpenWithList(),我把工程编译成功在XP 上实验,结果XP是不支持的,这些API和接口是Vista的,在XP上不能正常运行。。。。。。

文章中描述不专业,就算慢慢学习 ,慢慢积累经验。。。。 记录下自己的点点滴滴,逐步改进。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐