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

S.l.e!ep.¢%

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

 最近寫一個(gè)開發(fā)輔助工具,在這個(gè)過程要做一個(gè)類似文件快捷方式中查找目標(biāo)的功能,先查MSDN98,大家不要見笑,我現(xiàn)在一直都用它,沒有相應(yīng)的API,后又. Net 2003中的MSDN,找到了可以實(shí)現(xiàn)該功能的API,SHOpenFolderAndSelectItems()函數(shù),它的原型如下:

 ?。ň唧w用法參考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如何實(shí)現(xiàn)它呢?于是我就上網(wǎng)搜索,幾經(jīng)周折最終搜到的一篇文章,但它只是利用工具通過反匯編Windows API函數(shù)得到的代碼,可能可以實(shí)現(xiàn)與快捷方式相同的對(duì)話框(我沒有試過),但其代碼可讀性非常差,我只能參考一下大概的流程,他提到一個(gè)非常重要的一點(diǎn),那就是使用一個(gè)未公開的API函數(shù)SHGetIDispatchForFolder,它可幫助我打開文件夾。好不多說了,下面是關(guān)鍵的部分:

  查找目標(biāo)功能,分為兩個(gè)步驟,首先打開或找到目標(biāo)文件所在的文件夾,其次在打開的文件夾中選中相應(yīng)的項(xiàng)目(即文件)。在說這個(gè)步驟之前,先認(rèn)識(shí)一下,下面兩個(gè)結(jié)構(gòu)

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;

  這兩個(gè)結(jié)構(gòu)的數(shù)據(jù)保存的是項(xiàng)目定義符列表(僅是字面翻譯),這個(gè)結(jié)構(gòu)所表示的文件夾及文件除了正常的,還包括一些特殊的文件夾及文件(如目錄,我的電腦等),SHGetIDispatchForFolder函數(shù)正是用它的做為參數(shù),可以打開一些特殊的文件夾。SHGetIDispatchForFolder函數(shù)的原型是 :??????? HRESULT (WINAPI*gpfSHGetIDispatchForFolder)(ITEMIDLIST* pidl, IWebBrowserApp** ppIWebBrowserApp);   通??旖莘绞浇o我的ITEMIDLIST是包含文件名的,若直接調(diào)用上面的函數(shù),它將直接會(huì)打開出目標(biāo)文件,而不是打開文件夾。下面是區(qū)分文件及文件夾的代碼:
?pIdlFile = pidl;??????
?/// 找出目標(biāo)文件中文件名的偏移量
?while (cb = pIdlFile->mkid.cb)
?{
?? pidl2 = pIdlFile;
?? pIdlFile = (ITEMIDLIST*)((BYTE*)pIdlFile + cb);
?}

?cb = pidl2->mkid.cb;
?pidl2->mkid.cb = 0;
  下面是打開文件夾及選中文件的代碼,相信大家不難理解。???? /// 打開目標(biāo)文件所在的文件夾
?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)
?? {
??? /// 選中相應(yīng)的選項(xiàng)
??? pIShellFolderViewDual->SelectItem(bszFile, 0x1d);
??? pIShellFolderViewDual->Release();
?? }
?? return TRUE;
?}  源代碼中包含了一個(gè)DEMO。下面是完整的函數(shù),可以直接調(diào)用FindTarget(CString str)參數(shù)為文件名,若是快捷方式則會(huì)自動(dòng)指向其目標(biāo)。若代碼中已做過COM的初始化工作,請(qǐng)刪除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;

?/// 調(diào)用未公開的API函數(shù) 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及以上及系統(tǒng)才支持SHOpenFolderAndSelectItems() API
/// 那其它系統(tǒng)該怎么實(shí)現(xiàn)這個(gè)功能呢?只能采用其它的方法來處理
/// 首先用XP跟蹤到SHOpenFolderAndSelectItems()API中,看它是如何處理的,再用同樣的方法去實(shí)現(xiàn)
/// 其它系統(tǒng)的這個(gè)功能使用工具 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()函數(shù)的API地址
?? if (SUCCEEDED(gpfSHOpenFolderAndSelectItems((LPCITEMIDLIST*)pidlFolder,0,(LPCITEMIDLIST*)NULL,0)))
?? {
??? ///直接調(diào)用系統(tǒng)的功能
??? FreeLibrary(ghShell32);
??? return TRUE;
?? }
?? FreeLibrary(ghShell32);
?? return FALSE;
?}
?FreeLibrary(ghShell32);

?/// 當(dāng)操作系統(tǒng)不支持SHOpenFolderAndSelectItems()函數(shù)的API時(shí)的處理,
?/// 自已動(dòng)手寫一個(gè)與系統(tǒng)功能相同的代碼
?pidl = pidlFolder;
?pIdlFile = pidl;
?/// 找出目標(biāo)文件中文件名的偏移量
?while (cb = pIdlFile->mkid.cb)
?{
?? pidl2 = pIdlFile;
?? pIdlFile = (ITEMIDLIST*)((BYTE*)pIdlFile + cb);
?}

?cb = pidl2->mkid.cb;
?pidl2->mkid.cb = 0;

?/// 打開目標(biāo)文件所在的文件夾
?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)
?? {
??? /// 選中相應(yīng)的選項(xiàng)
??? 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))
?{
?? // 設(shè)置目標(biāo)文件
?? psl->SetPath(str);
?? /// 獲得目標(biāo)文件的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();
?? }

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

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

在VC6下編譯后的代碼,通過98,2k,XP的測試。
?
本篇文章來源于:開發(fā)學(xué)院 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>
            91久久国产精品91久久性色| 91久久精品网| 国产亚洲综合在线| 国产在线观看一区| 国内一区二区三区在线视频| 精品福利av| 亚洲日本国产| 一区二区三区久久| 亚洲欧美一区二区三区久久 | 久久久久久久久久久久久9999| 久久精品女人天堂| 免费欧美日韩国产三级电影| 欧美国产日韩在线| 欧美日韩一区在线| 国产日韩欧美制服另类| 狠狠干综合网| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美一区二区三区四区高清 | 亚洲视频日本| 先锋影音一区二区三区| 久久免费黄色| 欧美精品福利视频| 国产精品久久久久久久久久妞妞| 国产欧美一区二区精品仙草咪| 国产亚洲精久久久久久| 在线观看精品视频| 中文精品视频一区二区在线观看| 亚洲欧洲av一区二区| 久久综合给合久久狠狠狠97色69| 欧美黄色一级视频| 一区二区三区欧美成人| 久久av一区二区| 欧美激情一区二区三区| 国产精品香蕉在线观看| 亚洲国产成人高清精品| 亚洲午夜在线观看| 老司机精品视频网站| 亚洲美女电影在线| 久久精品一二三| 欧美日韩在线看| 激情综合中文娱乐网| 亚洲一区二区网站| 欧美大片在线影院| 亚洲影院色在线观看免费| 久久亚洲一区二区三区四区| 欧美体内谢she精2性欧美| 黄色成人av网站| 亚洲一区二区影院| 欧美国产综合视频| 香蕉久久精品日日躁夜夜躁| 欧美人与性禽动交情品| 好吊色欧美一区二区三区视频| 中文日韩欧美| 欧美freesex交免费视频| 亚洲视屏一区| 欧美经典一区二区三区| 狠狠做深爱婷婷久久综合一区| 亚洲午夜视频在线观看| 欧美福利专区| 欧美在线视频a| 国产精品久久久久久久久久久久久| 亚洲成在线观看| 久久精品国产一区二区三| 日韩亚洲在线观看| 欧美1区2区| 在线观看亚洲| 久久久久综合网| 这里只有精品视频| 欧美精品国产一区| 亚洲国产精品成人综合色在线婷婷| 欧美一级大片在线观看| 一区二区精品| 欧美日韩999| 亚洲精品久久久久久久久| 久久在线91| 欧美一区二区日韩一区二区| 国产精品久久久久久超碰| 一本综合精品| 亚洲精品老司机| 欧美成人亚洲| 亚洲黄色av| 欧美成人午夜免费视在线看片| 欧美在线视频免费| 国产亚洲精品久久久| 欧美在线www| 亚洲欧美日韩精品久久奇米色影视 | 亚洲电影第三页| 欧美1区3d| 亚洲精品视频免费观看| 亚洲国产精品久久久久婷婷884| 久久伊人一区二区| 亚洲第一精品在线| 亚洲动漫精品| 欧美激情一区二区三区在线视频| 亚洲精品影院在线观看| 亚洲国产天堂网精品网站| 欧美福利小视频| 一个色综合导航| 一区二区三区高清在线观看| 欧美午夜a级限制福利片| 亚洲一区www| 亚洲专区在线视频| 国产有码一区二区| 蜜臀av一级做a爰片久久| 久久综合九色综合欧美狠狠| 在线国产精品播放| 久久精品成人一区二区三区| 日韩午夜在线| 国产精品视频自拍| 欧美一区二区黄色| 午夜精品国产精品大乳美女| 国产精品欧美久久| 欧美一区二区| 亚洲专区在线视频| 国产午夜精品全部视频播放| 久久国产福利| 久久婷婷亚洲| 亚洲日本中文字幕区| 亚洲激情在线观看视频免费| 欧美精品日韩三级| 这里是久久伊人| 一区二区日韩伦理片| 国产精品mm| 欧美怡红院视频| 久久er99精品| 亚洲国产精品国自产拍av秋霞| 亚洲第一二三四五区| 欧美三级免费| 篠田优中文在线播放第一区| 香蕉久久夜色精品国产使用方法| 国产一区二区三区无遮挡| 鲁大师成人一区二区三区| 欧美极品欧美精品欧美视频| 亚洲一级片在线看| 午夜精品亚洲一区二区三区嫩草| 国产在线日韩| 亚洲高清不卡av| 国产欧美短视频| 美日韩在线观看| 欧美精品一区二区高清在线观看| 亚洲小视频在线| 欧美一区二区观看视频| 99视频一区二区| 亚洲欧美精品suv| 亚洲高清在线视频| 一本色道久久综合亚洲精品高清 | 亚洲欧美日韩在线观看a三区 | 亚洲国产精品123| 亚洲精品综合| 国产日韩欧美一区二区三区四区| 欧美激情国产精品| 国产精品国产三级国产a| 久久狠狠婷婷| 欧美高清在线观看| 小辣椒精品导航| 欧美精品1区2区3区| 欧美一区二区在线| 免费久久99精品国产自在现线| 亚洲女女女同性video| 亚洲欧美日韩精品久久| 一本色道久久88亚洲综合88| 翔田千里一区二区| 日韩视频久久| 久久精品在线| 亚洲伊人一本大道中文字幕| 久久久久国产精品一区二区| 亚洲特级毛片| 美日韩免费视频| 亚洲一区二区三区精品视频| 欧美国产日韩在线观看| 久久国内精品视频| 欧美日韩免费观看一区| 美女亚洲精品| 激情懂色av一区av二区av| 夜夜嗨av一区二区三区网页 | 久久久久久久综合日本| 欧美日韩国产一区二区| 欧美激情按摩| 黄色综合网站| 亚洲一区3d动漫同人无遮挡| 亚洲区国产区| 欧美怡红院视频| 欧美在线黄色| 国产精品va在线播放| 亚洲二区精品| 激情文学综合丁香| 久久不射网站| 午夜精品理论片| 欧美伦理一区二区| 欧美国产精品一区| 在线观看日韩一区| 欧美一区二区三区在线看| 亚洲欧美福利一区二区| 欧美日韩福利视频| 亚洲国产欧美国产综合一区| 国产亚洲综合性久久久影院| 午夜宅男久久久| 欧美在线免费| 国产精品午夜在线观看| 9久草视频在线视频精品|