打开Explorer并跳到某个目录并选中某个文件的不坑爹的写法,VC,SHOpenFolderAndSelectItems,Sample...

#程序

//打开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设计有很多可以改善的地方。譬如为什么发布博客叫“随笔”。博客就博客,转帖就转帖,不然点进去之后,里面还得解释一次干嘛。

转载于:https://www.cnblogs.com/FlyingCaddice/archive/2013/01/29/2881230.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值