#程序
//打开Explorer,并跳到某个目录并选中某个文件。如果传入Folder则打开Folder并选中Folder。不坑爹,保证在UAC打开和XP下面都能用。
VOID ExplorerOpenFile(const char* fullPath)
{
///CoInitialize() ;///这个如果你的工程没有,就自己加上就可以了,对应的下面要有CoUnInitialize()。一般这两个全局环境设置的函数不是放在这种应用函数里面的。
KPROCESS_ERROR(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &pShellLink)));
KPROCESS_ERROR(SUCCEEDED(pShellLink->SetPath(pathTemp)));
KPROCESS_ERROR(SUCCEEDED(pShellLink->GetIDList(&pList)));
KCHECK_ERROR(SUCCEEDED(SHOpenFolderAndSelectItems(pList, 0, NULL, 0)));
Exit0:
KRELEASE(pShellLink);
if (NULL != pList)
{
CoTaskMemFree(pList);
pList = NULL;
}
}
#几个宏的基本实现
#define KPROCESS_ERROR(condition) \
{ \
KCHECK_BOOL(condition); \
if (!(condition)) \
{ \
goto Exit0; \
} \
} NULL
KRELEASE就是SAFE_RELEASE
#后记:
我看了N个网页,一个个试,没有一个可以的。
/*char szCommand[MAX_PATH + 20];
KPROCESS_ERROR(0 < _stprintf_s(szCommand, "/select, %s/a.txt", fullPath));
::ShellExecute(NULL, "open", "explorer.exe", szCommand, NULL, SW_SHOWNORMAL);
Exit0:*/
包括上面这种做法,N多人就照别人说的复述这种做法,在我打开UAC的Windows7上面无论如何都不行,有时候又可以。这种一会可以一会不可以的做法没有用。
基本上能行的做法很多是用SHOpenFolderAndSelectItems的。问题只是如何得到IDList,我试了ILCreateFromPath系列的三个函数(SHILCreateFromPath, SHSimpleIDListFromPath)都返回了NULL,没有文章说为啥。看到一个用C#的货指出用IShellLink,一试,果然好用。
博客园的UI设计有很多可以改善的地方。譬如为什么发布博客叫“随笔”。博客就博客,转帖就转帖,不然点进去之后,里面还得解释一次干嘛。