#include <shlobj.h>
#include <tchar.h>#include   <stdio.h> 
#include   <stdlib.h> 
#include   <windows.h> 
#include   <process.h> 
#include   <conio.h>
#include <time.h>
#include <cstdio>
#include <stdarg.h>
#include <signal.h>
#include <stdlib.h>#include <string.h>
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; 
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) {
HRESULT(WINAPI * gpfSHOpenFolderAndSelectItems)(LPCITEMIDLIST * pidlFolder, UINT   cidl, LPCITEMIDLIST * apidl, DWORD   dwFlags); 
HINSTANCE ghShell32; 
ghShell32 = LoadLibrary(_T("Shell32.DLL")); 
if(ghShell32 == NULL) {
return   FALSE; 
}
gpfSHOpenFolderAndSelectItems = (HRESULT(WINAPI *)(LPCITEMIDLIST *, UINT, LPCITEMIDLIST *, DWORD)) 
GetProcAddress(ghShell32, "SHOpenFolderAndSelectItems"); 
if(gpfSHOpenFolderAndSelectItems != NULL) {
if(SUCCEEDED(gpfSHOpenFolderAndSelectItems((LPCITEMIDLIST *) pidlFolder, 0, (LPCITEMIDLIST *) NULL, 0))) {
FreeLibrary(ghShell32); 
return   TRUE;

FreeLibrary(ghShell32); 
return   FALSE;

FreeLibrary(ghShell32); 
return   FALSE;

void FindTarget(LPCTSTR    str) {
HRESULT hres;   
IShellLink* psl;   
ITEMIDLIST* pidl; 
IPersistFile* ppf;   
CoInitialize(NULL); 
printf("11111111, err=%d\n", GetLastError());
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *) &psl);   
if(SUCCEEDED(hres)) {
printf("222222222, err=%d\n", GetLastError());
psl-> SetPath(str); 
printf("666666666 , err=%d\n", GetLastError());
psl-> GetIDList(&pidl); 
hres = psl-> QueryInterface(IID_IPersistFile, (void * *) &ppf);   
if(SUCCEEDED(hres)) {
printf("3333333333, err=%d\n", GetLastError());
WCHAR wsz[MAX_PATH];
#ifdef   _UNICODE 
wcscpy(wsz, str); 
#else 
MultiByteToWideChar(CP_ACP, 0, str, -1, wsz, MAX_PATH);   
#endif   
//   Load   the   shortcut.   
hres = ppf-> Load(wsz, STGM_READ);   
if(SUCCEEDED(hres)) {
printf("444444444, err=%d\n", GetLastError());
psl-> GetIDList(&pidl);

ppf-> Release();

printf("55555555555, err=%d\n", GetLastError());
XZSHOpenFolderAndSelectItems(pidl);  psl-> Release();

CoUninitialize();
}int main(int argc, char* argv[]) { FindTarget(("c:\日啊日.txt"));
return 0;
}我想要的就功能是 和Explorer的文件的快捷方式的属性对话框中“查找目标”那样
就像以上代码是我从网上找来的
他原先是 void FindTarget(CString str) 
但我的程序不用mfc,就改成了 void FindTarget(LPCTSTR str) 
请问应该如何修改?

解决方案 »

  1.   

    补充。。
    以上代码不能正确实现。
    "SHGetIDispatchForFolder " 最后的空格去掉了,也不行
      

  2.   


    MFC中的【CString】类和【char*】还是有一定区别的。
    最大的区别在于,CString类会自动申请内存,而用char*需要自己申请和释放内存。
      

  3.   

    int main(int argc, char* argv[]) {    FindTarget(_T("c:\日啊日.txt"));
        return 0;
    }
      

  4.   

    FindTarget(("c:\日啊日.txt"));
    参数要给快捷方式的文件名及路径。
      

  5.   

    还是不行。
    FindTarget(_T("c:\日啊日.txt")); 出现如下结果11111111, err=0
    222222222, err=0
    666666666 , err=183
    3333333333, err=183
    55555555555, err=123 
    Press any key to continue
    〖183〗-当文件已存在时,无法创建该文件。 
    〖123〗-文件名、目录名或卷标语法不正确。 为什么会有123错误
    如果 FindTarget(_T("c:\\日啊日.txt")); 出现如下结果11111111, err=0
    222222222, err=0
    666666666 , err=1
    3333333333, err=1
    444444444, err=0
    55555555555, err=0
    Press any key to continue〖1〗-功能错误。
      

  6.   

    参数给快捷方式名称路径,例如:"C:\\12345.lnk"。
      

  7.   

    试了 "c:\\日啊日.txt.lnk" 和 "c:\日啊日.txt.lnk"
    结果
    11111111, err=0
    222222222, err=0
    666666666 , err=183
    3333333333, err=183
    55555555555, err=2
    Press any key to continue〖2〗-系统找不到指定的文件。
      

  8.   

    问题解决了,原因出在
    MultiByteToWideChar(CP_ACP, 0, str, -1, wsz, MAX_PATH);
    去掉后用 FindTarget(_T("c:\\日啊日.txt")); 一切正常