用VC6.0实现快捷方式中的查找目标功能

用VC6.0实现快捷方式中的查找目标功能,第1张

用VC6.0实现快捷方式中的查找目标功能,第2张

最近,我写了一个开发辅助工具。在这个过程中,我要做一个类似于在文件快捷方式中寻找目标的功能。首先,查查MSDN,不要嘲笑它。我现在一直在用,但是没有相应的API。后来,我在。Net 2003的SHOpenFolderAndSelectItems()函数,可以实现这个功能。其原型如下:

(具体用法请参考msdn)" opensa Microsoft & reg;Windows & reg资源管理器窗口,其中选定了特定文件夹中的指定项目。

HRESULT SHOpenFolderAndSelectItems(
LPCITEMIDLIST pidlFolder,
UINT cidl,
LPCITEMIDLIST *apidl,
DWORD dw flags
);但是,它需要Windows XP和Windows XP。如何在Win2000或Win98中实现?于是在网上搜了一下,几经周折终于找到了一篇文章,不过就是用工具反汇编Windows API函数得到的代码。它也许能实现和快捷方式一样的对话框(我没试过),但是它的代码可读性很差。我只能参考大概的流程。他提到了很重要的一点,就是使用了一个未公开的API函数SHGetIDispatchForFolder,可以帮我打开文件夹。话不多说,下面是关键部分:

搜索功能分为两步。首先打开或找到目标文件所在的文件夹,然后在打开的文件夹中选择相应的项目(即文件)。在说这一步之前,我们先了解一下以下两个结构。

typedef struct _ SHITEMID {
USHORT CB;
BYTE abID[1];
} SHITEMID,* LPSHITEMID
typedef const shite mid * LPCSHITEMID;

typedef struct _ ITEMIDLIST {
SHITEMID mkid;
} ITEMIDLIST,* LPITEMIDLIST
typedef const ITEMIDLIST * LPCITEMIDLIST;

这两个结构的数据存储了项目定义的列表(仅直译)。这种结构表示的文件夹和文件包括一些特殊的文件夹和文件(如目录、我的电脑等。)除了正常的。SHGetIDispatchForFolder函数可以用它的参数打开一些特殊的文件夹。getisdispatchfolder函数的原型是:
hresult(winapi * gpfshgetidispatchfolder)(itemidlist * pidl,iwebbrowsenapp * * ppiwebbrowsenapp);通常,快捷方式给我的ITEMIDLIST包含文件名。如果直接调用上面的函数,会直接打开目标文件而不是文件夹。以下是区分文件和文件夹的代码:

pIdlFile = pidl
//找出文件名在目标文件中的偏移量
while(CB = pidlfile-> mkid . CB)
{
PID L2 = pidlfile;
pIdlFile =(ITEMIDLIST *)((BYTE *)pIdlFile+CB);
}

CB = PID L2-> mkid . CB;
PID L2-> mkid . CB = 0;
下面是打开文件夹并选择文件的代码。我相信你很容易理解。///打开目标文件所在的文件夹
if(Succeeded(getshellfolderview dual(pidl,& pishellfolderweedual))]
{
PID L2-> mkid . CB = CB;
// 0取消选择该项。
// 1选择项目。
// 3将该项置于编辑模式。
// 4取消选择除指定项目之外的所有项目。
// 8确保该项显示在视图中。
// 0x10给予该项焦点。
cole variant bsz file(PID L2);

if(pishell folderviewdual!= null)
{
//勾选对应的选项
pishell folderviewual-> SelectItem(bsz file,0x1D);
pishelfolderviewdual-> Release();
}
返回TRUE
}源代码中包含一个演示。下面是一个完整的函数。可以直接调用FindTarget(CString str)参数作为文件名。如果是快捷方式,会自动指向目标。如果代码中已经做了COM的初始化,请删除CoInitialize(NULL);和coun initialize();声明。

HRESULT GetShellFolderViewDual(ITEMIDLIST * pidl,IShellFolderViewDual * * ppIShellFolderViewDual)
{
IWebBrowserApp * pIWebBrowserApp;
IDispatch * pDoc;
HWND HWND;
HRESULT HR;
h instance ghSHDOCVW;


HRESULT(WINAPI * gpfSHGetIDispatchForFolder)(ITEMIDLIST * pidl,IWebBrowserApp * * ppIWebBrowserApp);

* ppIShellFolderViewDual = NULL

ghSHDOCVW = LoadLibrary(_ T(" SHDOCVW。DLL "));
if(ghSHDOCVW = = NULL)
返回FALSE

pIWebBrowserApp = NULL
gpfSHGetIDispatchForFolder =
(HRESULT(WINAPI *)(ITEMIDLIST *、IWebBrowserApp * *))GetProcAddress(ghSHDOCVW," shgetididispatchforfolder ");
if(gpfSHGetIDispatchForFolder = = NULL)
返回FALSE

///调用未发布的API函数shgetisdispatchfolder
if(SUCCEEDED(gpfshgetidispatchfolder(pidl,& pIWebBrowserApp)))
{
if(SUCCEEDED(pIWebBrowserApp-> get _ HWND((long *)& HWND)))
{
SetForegroundWindow(HWND);
ShowWindow(hWnd,SW _ show normal);
}

if(SUCCEEDED(HR = pIWebBrowserApp-> get _ Document(& pDoc))
{
pDoc-> query interface(IID _ IShellFolderViewDual,(void * *)ppIShellFolderViewDual);
pDoc-> Release();
}

pIWebBrowserApp-> Release();
}
free library(ghSHDOCVW);

返回TRUE
}

BOOL XZSHOpenFolderAndSelectItems(ITEMIDLIST * pidlFolder)
{
ITEMIDLIST * pidl,* pidl2
ITEMIDLIST * pIdlFile;
u short CB;
IShellFolderViewDual * pishelfolderviewdual;

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 用VC6.0实现快捷方式中的查找目标功能

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情