最近写一个开发辅助工具,在这个过程要做一个类似文件快捷方式中查找目 标的功能,先查MSDN98,大家不要见笑,我现在一直都用它,没有相应的API, 后又. Net 2003中的MSDN,找到了可以实现该功能的API, SHOpenFolderAndSelectItems()函数,它的原型如下:
(具体用法参考 MSDN)“Opens a Microsoft Windows Explorer window with specified items in a particular folder selected.”
HRESULTSHOpenFolderAndSelectItems(
LPCITEMIDLISTpidlFolder,
UINTcidl,
LPCITEMIDLIST*apidl,
DWORDdwFlags
);
但是,它需 要Windows XP及上,若在Win2000或Win98如何实现它呢?于是我就上网搜索,几 经周折最终搜到的一篇文章,但它只是利用工具通过反汇编Windows API函数得 到的代码,可能可以实现与快捷方式相同的对话框(我没有试过),但其代码可 读性非常差,我只能参考一下大概的流程,他提到一个非常重要的一点,那就是 使用一个未公开的API函数SHGetIDispatchForFolder,它可帮助我打开文件夹。 好不多说了,下面是关键的部分:
查找目标功能,分为两个步骤,首先 打开或找到目标文件所在的文件夹,其次在打开的文件夹中选中相应的项目(即 文件)。在说这个步骤之前,先认识一下,下面两个结构
typedef struct _SHITEMID {
USHORT cb;
BYTE abID[1];
} SHITEMID, * LPSHITEMID;
typedef const SHITEMID * LPCSHITEMID;
typedef struct _ITEMIDLIST {
SHITEMID mkid;
} ITEMIDLIST, * LPITEMIDLIST;
typedef const ITEMIDLIST * LPCITEMIDLIST;
这两个结构的数据保存的是项目定义符列表(仅是字 面翻译),这个结构所表示的文件夹及文件除了正常的,还包括一些特殊的文件 夹及文件(如目录,我的电脑等),SHGetIDispatchForFolder函数正是用它的 做为参数,可以打开一些特殊的文件夹。SHGetIDispatchForFolder函数的原型 是 :HRESULT (WINAPI*gpfSHGetIDispatchForFolder)(ITEMIDLIST* pidl, IWebBrowserApp** ppIWebBrowserApp);
通常快捷方式给我的 ITEMIDLIST是包含文件名的,若直接调用上面的函数,它将直接会打开出目标文 件,而不是打开文件夹。下面是区分文件及文件夹的代码:
pIdlFile = pidl;
/// 找出目标文件中文件名的偏移量
while (cb = pIdlFile->mkid.cb)
{
pidl2 = pIdlFile;
pIdlFile = (ITEMIDLIST*)((BYTE*)pIdlFile + cb);
}
cb = pidl2->mkid.cb;
pidl2->mkid.cb = 0;