1 BOOL OpenFilePath( LPCTSTR lpszFile ) 2 { 3 HINSTANCE hInst; 4 HRESULT hr; 5 LPITEMIDLIST pidFile; 6 TCHAR szFile[MAX_PATH]; 7 USES_CONVERSION; 8 9 if ( lpszFile == NULL || *lpszFile == 0 ) 10 { 11 return FALSE; 12 } 13 14 memcpy( szFile, lpszFile, sizeof( szFile ) ); 15 16 if ( ::PathFileExists( szFile ) ) 17 { 18 hr = ::SHParseDisplayName( T2W( szFile ), NULL, &pidFile, 0, NULL ); 19 if ( hr != S_OK ) 20 { 21 return FALSE; 22 } 23 24 hr = ::SHOpenFolderAndSelectItems( pidFile, 0, NULL, 0 ); 25 if ( hr != S_OK ) 26 { 27 ::CoTaskMemFree( pidFile ); 28 return FALSE; 29 } 30 31 ::CoTaskMemFree( pidFile ); 32 } 33 else 34 { 35 ::PathRemoveFileSpec( szFile ); 36 37 if ( !::PathIsDirectory( szFile ) ) 38 { 39 return FALSE; 40 } 41 42 hInst = ::ShellExecute( NULL, NULL, NULL, NULL, szFile, SW_SHOWNORMAL ); 43 if ( ( DWORD )hInst <= 32 ) 44 { 45 return FALSE; 46 } 47 } 48 49 return TRUE; 50 }