最近写一个开发辅助工具,在这个过程要做一个类似文件快捷方式中查找目标的功能,先查MSDN98,大家不要见笑,我现在一直都用它,没有相应的API,后又. Net 2003中的MSDN,找到了可以实现该功能的API,SHOpenFolderAndSelectItems()函数,它的原型如下:
(具体用法参考MSDN)“Opens a Microsoft® Windows® Explorer window with specified items in a particular folder selected.”

HRESULT SHOpenFolderAndSelectItems(    LPCITEMIDLIST pidlFolder,    UINT cidl,    LPCITEMIDLIST *apidl,    DWORD dwFlags);

  但是,它需要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;

下面是打开文件夹及选中文件的代码,相信大家不难理解。

   /// 打开目标文件所在的文件夹if (SUCCEEDED(GetShellFolderViewDual(pidl, &pIShellFolderViewDual))) {pidl2->mkid.cb = cb;// 0 Deselect the item. // 1 Select the item. // 3 Put the item in edit mode. // 4 Deselect all but the specified item. // 8 Ensure the item is displayed in the view. // 0x10 Give the item the focus. COleVariant bszFile(pidl2);      if(pIShellFolderViewDual != NULL){/// 选中相应的选项pIShellFolderViewDual->SelectItem(bszFile, 0x1d);pIShellFolderViewDual->Release();}return TRUE;}

  源代码中包含了一个DEMO。下面是完整的函数,可以直接调用FindTarget(CString str)参数为文件名,若是快捷方式则会自动指向其目标。若代码中已做过COM的初始化工作,请删除CoInitialize(NULL);及CoUninitialize();语句。

HRESULT GetShellFolderViewDual(ITEMIDLIST* pidl, IShellFolderViewDual** ppIShellFolderViewDual){IWebBrowserApp* pIWebBrowserApp;IDispatch* pDoc;HWND hWnd;HRESULT hr;HINSTANCE ghSHDOCVW;HRESULT (WINAPI*gpfSHGetIDispatchForFolder)(ITEMIDLIST* pidl, IWebBrowserApp** ppIWebBrowserApp);*ppIShellFolderViewDual = NULL;ghSHDOCVW = LoadLibrary(_T("SHDOCVW.DLL"));if (ghSHDOCVW == NULL)return FALSE;pIWebBrowserApp=NULL;gpfSHGetIDispatchForFolder = (HRESULT (WINAPI*)(ITEMIDLIST*, IWebBrowserApp**)) GetProcAddress(ghSHDOCVW, "SHGetIDispatchForFolder");if (gpfSHGetIDispatchForFolder == NULL)return FALSE;/// 调用未公开的API函数 SHGetIDispatchForFolderif (SUCCEEDED(gpfSHGetIDispatchForFolder(pidl, &pIWebBrowserApp))) {if (SUCCEEDED(pIWebBrowserApp->get_HWND((long*)&hWnd))) {SetForegroundWindow(hWnd);ShowWindow(hWnd, SW_SHOWNORMAL);}if (SUCCEEDED(hr = pIWebBrowserApp->get_Document(&pDoc))){pDoc->QueryInterface(IID_IShellFolderViewDual, (void**) ppIShellFolderViewDual);pDoc->Release();}pIWebBrowserApp->Release();}FreeLibrary(ghSHDOCVW);return TRUE;}BOOL XZSHOpenFolderAndSelectItems(ITEMIDLIST *pidlFolder){ITEMIDLIST *pidl, *pidl2;ITEMIDLIST* pIdlFile;USHORT cb;IShellFolderViewDual* pIShellFolderViewDual;HRESULT (WINAPI *gpfSHOpenFolderAndSelectItems)(LPCITEMIDLIST *pidlFolder, UINT cidl, LPCITEMIDLIST *apidl, DWORD dwFlags);HINSTANCE ghShell32;/// 只有WinXp及以上及系统才支持SHOpenFolderAndSelectItems() API/// 那其它系统该怎么实现这个功能呢?只能采用其它的方法来处理/// 首先用XP跟踪到SHOpenFolderAndSelectItems()API中,看它是如何处理的,再用同样的方法去实现/// 其它系统的这个功能使用工具 VC6 .net 2003 MSDN Ollydbg v1.10中文版ghShell32 = LoadLibrary(_T("Shell32.DLL"));if (ghShell32 == NULL)return FALSE;gpfSHOpenFolderAndSelectItems =          (HRESULT (WINAPI*)(LPCITEMIDLIST*, UINT, LPCITEMIDLIST*, DWORD)) GetProcAddress(ghShell32, "SHOpenFolderAndSelectItems");if (gpfSHOpenFolderAndSelectItems != NULL){/// 可以获得SHOpenFolderAndSelectItems()函数的API地址if (SUCCEEDED(gpfSHOpenFolderAndSelectItems((LPCITEMIDLIST*)pidlFolder,0,(LPCITEMIDLIST*)NULL,0))) {///直接调用系统的功能FreeLibrary(ghShell32);return TRUE;}FreeLibrary(ghShell32);return FALSE;}FreeLibrary(ghShell32);/// 当操作系统不支持SHOpenFolderAndSelectItems()函数的API时的处理,/// 自已动手写一个与系统功能相同的代码pidl = pidlFolder;pIdlFile = pidl;/// 找出目标文件中文件名的偏移量while (cb = pIdlFile->mkid.cb) {pidl2 = pIdlFile;pIdlFile = (ITEMIDLIST*)((BYTE*)pIdlFile + cb);}cb = pidl2->mkid.cb;pidl2->mkid.cb = 0;/// 打开目标文件所在的文件夹if (SUCCEEDED(GetShellFolderViewDual(pidl, &pIShellFolderViewDual))) {pidl2->mkid.cb = cb;// 0 Deselect the item.  // 1 Select the item.  // 3 Put the item in edit mode.  // 4 Deselect all but the specified item.  // 8 Ensure the item is displayed in the view.  // 0x10 Give the item the focus.  COleVariant bszFile(pidl2);if(pIShellFolderViewDual != NULL){/// 选中相应的选项pIShellFolderViewDual->SelectItem(bszFile, 0x1d);pIShellFolderViewDual->Release();}return TRUE;}return FALSE;}void FindTarget(CString str){HRESULT hres; IShellLink *psl; ITEMIDLIST *pidl;IPersistFile *ppf; CoInitialize(NULL);// Get a pointer to the IShellLink interface. hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,     IID_IShellLink, (LPVOID*)&psl); if (SUCCEEDED(hres)) { // 设置目标文件psl->SetPath(str);/// 获得目标文件的ITEMIDLISTpsl->GetIDList(&pidl);// Get a pointer to the IPersistFile interface. hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf); if (SUCCEEDED(hres)) { WCHAR wsz[MAX_PATH]; #ifdef _UNICODEwcscpy(wsz, str);#else// Ensure that the string is Unicode. MultiByteToWideChar(CP_ACP, 0, str, -1, wsz, MAX_PATH); #endif  // Load the shortcut. hres = ppf->Load(wsz, STGM_READ); if (SUCCEEDED(hres)) { /// 获得快捷方式的ITEMIDLISTpsl->GetIDList(&pidl);}m ppf->Release();}/// 打开文件夹并选中项目XZSHOpenFolderAndSelectItems(pidl);psl->Release();}CoUninitialize();}

转载于:https://www.cnblogs.com/cccc123/archive/2010/04/17/1714188.html

如何实现快捷方式中的查找目标功能相关推荐

  1. Excel 中的查找替换功能

    Excel 中的查找替换功能: https://zhuanlan.zhihu.com/p/143578009 查找替换:将 0 替换为空值 control + H 调出查找替换的窗口 空值在键盘中输出 ...

  2. 计算机上的查找替换功能快速格式化,Excel 2016中使用查找替换功能应用技巧

    大家知道Excel中有查找和替换这个功能,懂得按住[Ctrl+F]可以直接打开"查找"对话框,按住[Ctrl+H]直接打开"替换"对话框.但你真的很了解这个功能 ...

  3. 向uliweb中添加查找配置项功能

    2019独角兽企业重金招聘Python工程师标准>>> 在uliweb中,我们会把配置写在各种settings.ini中,因为uliweb可以实现配置项的合并处理,所以我们最终拿到的 ...

  4. 数据结构与算法之美 32 字符串匹配基础(中):如何实现文本编辑器中的查找功能

    如何实现文本编辑器中的查找功能 背景 BM 算法的核心思想 BM 算法原理分析 1. 坏字符规则 2. 好后缀规则 BM 算法代码实现 背景 文本编辑器中的查找替换功能,我想你应该不陌生吧?比如,我们 ...

  5. VB应用程序中实现查找和替换功能

    一?前言 尽管Visual Basic并不是我最喜欢的开发工具,但我喜欢它简单而又丰富的库集.每当开发一个需要处理大量文本数据的应用程序时,需要具有拼写错误纠正功能,例如,微软的Word程序,当运行& ...

  6. word7计算机搜索设置,win7系统下word文档中进行查找和替换的方法【图文教程】...

    在win7系统电脑中,我们经常会用到word软件来编辑一些文档,已经成为装机必备软件,而在使用word的时候会使用到多种编辑的处理方式,比如查找替换功能,尤其是在长篇的文档中,当需要替换某些字或符号的 ...

  7. 单词迷阵游戏就是从一个10x10的字母矩阵中找出目标单词,查找方向可以从左往右、从右往左、从上往下或者从下往上。例如下面的迷阵中包含quot等单词。

    单词迷阵游戏就是从一个10x10的字母矩阵中找出目标单词,查找方向可以从左往右.从右往左.从上往下或者从下往上.例如下面的迷阵中包含quot等单词. rmhlzxceuq bxmichelle mnn ...

  8. 计算机上的查找替换功能快速格式化,Word2013文档中使用查找和替换功能来快速更改文本格式的方法...

    在对文档进行处理时灵活使用Word的查找和替换功能将能够取得事半功倍的效果.下面介绍Word2013文档中使用查找和替换功能来快速更改文本格式的方法. 1.在"开始"选项卡中单击& ...

  9. openCV中meanshift算法查找目标

    一.简介 图像直方图的反向投影是一个概率分布图,表示一个指定图像片段出现在特定位置的概率.当我们已知图像中某个物体的大体位置时,可以通过概率分布图找到物体在另一张图像中的准确位置.我们可以设定一个初始 ...

最新文章

  1. 〖Linux〗多个JDK版本之间快速切换
  2. 全网最细节的sds讲解,从理论到实践!
  3. 一个创业者的妥协与希望
  4. 把一个人的特点写具体作文_部编版五年级下册语文 第五单元:习作 | 把一个人的特点写具体 电子课本+教案课件...
  5. 微信小程序获取unionid为空
  6. JS判断客户端是否是iOS或者Android
  7. Spring集成PageHelper的简单用法
  8. android textview获取背景颜色,Android TextView背景颜色与背景图片设置
  9. MyEclipse 修改 默认的 工作空间(转)
  10. windows10环境下node js版本快速升级
  11. Linux资源控制-CPU和内存【转】
  12. Android热修复技术初探(三):动态加载外部资源
  13. ORB_SLAM2探秘 第二章
  14. python导入cv2
  15. Unity编辑器扩展工具Shader Forge和Behavior Designer(行为树)和 Cinema Director
  16. 【机器学习】一型模糊集和二型模糊集
  17. postgres汉字转换为拼音
  18. miui编译第三方卡米 对应的修改步骤位置
  19. 深入浅出学算法008-韩信点兵
  20. Android扫描车牌,车牌拍照识别SDK

热门文章

  1. 互联网Internet体系结构以及网关协议OSPF
  2. bzoj 2724: [Violet 6]蒲公英(分块预处理)
  3. 利用中值滤波而不是均值滤波去除椒盐噪声(脉冲噪声)
  4. HBase Region 自动拆分策略
  5. java发送接收UDP数据包:字符串,byte[]字节数组,文件等
  6. 【Proteus仿真8086】简单IO接口实验——无条件传输和查询方式
  7. PYUIC和PYRRC作为外部工具的配置
  8. oracle sga设置 256G,Oracle SGA大小的解决方法的调整
  9. Python学习笔记--6.2 文件读写
  10. node 创建静态web服务器(上)