青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

用VC6.0實現快捷方式中的查找目標功能

Posted on 2010-08-20 13:47 S.l.e!ep.¢% 閱讀(489) 評論(0)  編輯 收藏 引用 所屬分類: VC

 最近寫一個開發輔助工具,在這個過程要做一個類似文件快捷方式中查找目標的功能,先查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函數 SHGetIDispatchForFolder
?if (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);
?? /// 獲得目標文件的ITEMIDLIST
?? psl->GetIDList(&pidl);

?? // Get a pointer to the IPersistFile interface.
?? hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
?? if (SUCCEEDED(hres))
?? {
??? WCHAR wsz[MAX_PATH];
#ifdef _UNICODE
??? wcscpy(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))
??? {
???? /// 獲得快捷方式的ITEMIDLIST
???? psl->GetIDList(&pidl);
??? }m
??? ppf->Release();
?? }

?? /// 打開文件夾并選中項目
?? XZSHOpenFolderAndSelectItems(pidl);

?? psl->Release();
?}
?CoUninitialize();
}

在VC6下編譯后的代碼,通過98,2k,XP的測試。
?
本篇文章來源于:開發學院 http://edu.codepub.com?? 原文鏈接:http://edu.codepub.com/2009/0808/12691.php

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情精品久久久六区热门| 亚洲综合成人在线| 欧美日韩在线视频观看| 免费国产一区二区| 欧美日韩在线视频首页| 欧美国产日韩精品| 尤物网精品视频| 亚洲欧美日韩高清| 欧美一级二区| 国产伦一区二区三区色一情| 亚洲欧美国产制服动漫| 久久国产婷婷国产香蕉| 国产乱码精品1区2区3区| 亚洲女女女同性video| 亚洲在线视频网站| 国产精品av免费在线观看| 日韩午夜av在线| 日韩天堂在线视频| 欧美精品色一区二区三区| 欧美国产一区在线| 伊人影院久久| 免费在线亚洲| 亚洲人体一区| 亚洲二区在线视频| 欧美激情综合亚洲一二区| 亚洲免费大片| 欧美一级视频免费在线观看| 国产欧美日韩三区| 久久免费视频网站| 91久久精品国产91久久性色| 国产精品99久久久久久有的能看| 国产精品午夜电影| 久久九九有精品国产23| 亚洲国产精品久久久久秋霞不卡| 亚洲精品乱码久久久久| 国产精品国产自产拍高清av| 欧美专区在线观看一区| 亚洲国产精品成人综合色在线婷婷 | 夜夜嗨av色综合久久久综合网| 亚洲私人影院在线观看| 国产精品国产精品| 欧美中文字幕在线视频| 亚洲电影有码| 亚洲自拍啪啪| 99热免费精品| 欧美国产精品人人做人人爱| 日韩视频一区二区三区在线播放| 欧美一区二区视频在线观看2020| 激情一区二区三区| 欧美日韩免费在线| 久久精品视频一| 99精品国产99久久久久久福利| 久久激情五月婷婷| 一区二区三区偷拍| 伊人成人网在线看| 国产精品久久7| 久热精品在线| 亚洲欧美日韩国产一区二区| 亚洲国产天堂久久综合| 久久成人羞羞网站| 夜夜精品视频| 在线观看视频免费一区二区三区| 欧美午夜影院| 久久综合国产精品| 午夜精品久久久久久99热软件| 亚洲激情视频网站| 美乳少妇欧美精品| 久久精品99国产精品| 亚洲一区二区成人在线观看| 亚洲韩国日本中文字幕| 国产亚洲女人久久久久毛片| 欧美日韩二区三区| 六月婷婷一区| 久久激情视频久久| 亚洲午夜电影在线观看| 亚洲国产日本| 亚洲美女av在线播放| 午夜精品一区二区三区在线播放| 精品福利电影| 国产日韩欧美三区| 国产精品久久久久影院亚瑟| 欧美噜噜久久久xxx| 蜜臀久久99精品久久久久久9 | 亚洲社区在线观看| 亚洲国产精品专区久久| 国产一区视频在线看| 国产精品永久| 国产精品视频专区| 国产精品老牛| 国产精品国产三级国产专播品爱网| 欧美激情在线狂野欧美精品| 男人的天堂亚洲在线| 麻豆精品在线视频| 久久久国产一区二区| 久久成人综合视频| 久久久福利视频| 久久www免费人成看片高清| 性欧美办公室18xxxxhd| 亚洲欧美日韩天堂| 亚洲欧美日韩电影| 欧美一级在线视频| 久久精品五月婷婷| 久久精品夜色噜噜亚洲a∨| 欧美一区三区三区高中清蜜桃 | 美日韩免费视频| 米奇777超碰欧美日韩亚洲| 国产精品高潮呻吟视频| 麻豆精品视频在线观看| 久久影院午夜片一区| 欧美日韩国产999| 欧美剧在线免费观看网站| 狼人天天伊人久久| 久久一日本道色综合久久| 久久久综合网站| 老色鬼久久亚洲一区二区| 免费亚洲电影在线观看| 蘑菇福利视频一区播放| 欧美精品在线观看播放| 欧美日韩一级黄| 国产精品毛片高清在线完整版| 国产麻豆午夜三级精品| 国产一区亚洲| 亚洲国产精品尤物yw在线观看| 狠狠色狠狠色综合| 亚洲人成人一区二区在线观看| 99国产精品视频免费观看一公开| 日韩一区二区久久| 亚洲字幕一区二区| 久久久久亚洲综合| 亚洲国产精品一区二区三区| 日韩视频在线免费观看| 欧美亚洲一区二区在线| 免费日韩视频| 国产精品女人久久久久久| 激情国产一区二区| 日韩视频不卡中文| 午夜精品久久久久久久| 美女精品在线| 99这里有精品| 久久九九精品99国产精品| 欧美日本三区| 狠狠色丁香婷婷综合| 一区二区精品在线观看| 久久精品首页| 中文久久乱码一区二区| 欧美一区二区高清在线观看| 欧美18av| 国产日韩亚洲欧美| 99精品视频一区二区三区| 久久狠狠一本精品综合网| 欧美高清不卡在线| 亚洲欧美日韩一区二区三区在线观看| 久久综合激情| 国产欧美韩日| 一区二区三区高清| 久久久久久久一区二区| 亚洲美女av黄| 久久综合伊人77777蜜臀| 国产精品久久二区| 亚洲精品欧美极品| 久久久久亚洲综合| 亚洲影音一区| 欧美日韩精品久久| 精品成人一区二区| 欧美亚洲网站| 亚洲区国产区| 久久视频免费观看| 国产日韩一区二区三区在线播放| 一本色道久久综合狠狠躁的推荐| 久久夜色精品国产欧美乱极品| 亚洲视频你懂的| 欧美日韩精品一区二区天天拍小说 | 欧美日韩三级视频| 国产亚洲精品aa午夜观看| 这里是久久伊人| 亚洲高清视频中文字幕| 久久精品一区二区国产| 国产精品日本| 亚洲一区二区在线播放| 91久久久久| 欧美刺激性大交免费视频| 永久域名在线精品| 久久成人国产精品| 亚洲影院色无极综合| 欧美日韩一区二区三区在线观看免| 最新成人av网站| 欧美第一黄色网| 久久艳片www.17c.com| 今天的高清视频免费播放成人| 欧美在线1区| 亚洲一区在线观看免费观看电影高清| 欧美日韩伊人| 亚洲高清中文字幕| 日韩午夜av| 欧美国产日韩二区| 卡一卡二国产精品| 亚洲黄页一区| 欧美91精品| 麻豆成人在线播放| 亚洲国产高清视频|