#. SHGetFileInfo()로 무엇을 할 수 있을까?
1.실행파일의 플팻폼을 Win32, Win16, MS-DOS 알아내기
2.파일아이콘의 특성들
3.디스플레이 속성
4.그파일만의 다른 특수 속성들..

#. SHGetFileInfo 함수의 구조
DWORD SHGetFileInfo(
LPCTSTR pszPath, 경로 버퍼
DWORD dwAttrib, 파일 속성의 조합
SHFILEINFO FAR* psfi, SHFILEINFO 구조체의 주소(반환값)
UINT cbFileInfo, 위 구조체의 크기
UINT uFlags) 이 플래그에 의해서 함수의 행동과 정보가 결정됨.

#. SHFILEINFO 구조체
typedef struct_SHFILEINFO
{
HICON hIcon;
int iIcon;
DWORD dwAttributes;
char szDisplayName[MAX_PATH];
char szTypeName[80];
} SHFILEINFO;


#. 간단한 예제 (www.wrox.com)
SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
DWORD dwRC = SHGetFileInfo(파일경로, 속성, &sfi, 크기, 플래그들);

#. 각종 플래그값
SHGFI_ICON - 파일 아이콘의 핸들
SHGFI_DISPLAYNAME - 파일 디스플레이 이름
SHGFI_TYPENAME - 파일 종류 문자열
SHGFI_ATTRIBUTES - 파일 속성
SHGFI_ICONLOCATION - 아이콘이 들어있는 파일 이름에 대한 포인터
이 플래그는 SHGFI_DISPLAYNAME과 함께 사용할 수 없다.
경로가 폴더일때만 정상 작동한다.
SHGFI_EXETYPE - 대상 플랫폼을 반환한다.
SHGFI_SYSICONINDEX 주어진 아이콘의 시스템 이미지 리스트의 핸들 반환.
인덱스는 구조체의 iIcon에 저장된다.

SHGFI_LARGEICON 큰아이콘을 찾아낸다.
SHGFI_SMALLICON 작은 아이콘
SHGFI_OPENICON 폴더의 경우 열렸을 때의 아이콘.
SHGFI_SHELLICONSIZE 아이콘의 크기를 알아낸다.
SHGFI_SELECTED 구한 아이콘이 선택되었을때 화면에 나타나는 아이콘(하이라이트된 형태)
SHGFI_LINKOVERLAY 바로가기 아이콘

#. 간단한 예제들...

EX 1) 아이콘 읽기

HICON GetFileTypeIcon(LPCTSTR szFileType, LPCTSTR szTypeName)
{
SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
SHGetFileInfo(szFileType, 0, &sfi, sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_TYPENAME);

lstrcpy(szTypeName, sfi.szTypeName);
return sfi.hIcon);
}

EX 2) PIDL의 사용

SHGFI_PIDL은 파일 이름인 것처럼 전달되고 아이템이 실제로는 PIDL임을 시스템에게 알린다.

LPITEMIDLIST pidl;
SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidl);
DWORD dwRC = SHGetFileInfo(
reinterpret_cast(pidl), 속성, &sfi,
sizeof(SHFILEINFO), 플래그 | SHGFI_PIDL);

EX 3) 공유폴더인가?

BOOL IsDirectoryShared(LPCTSTR dirname)
{
SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
SHGetFileInfo(dirname, 0, &sfi, sizeof(SHFILEINFO),
SHGFI_ATTRIBUTES);

return (sfi.dwAttributes & SFGAO_SHARE);
}


EX 4) 공유폴더 아이콘 구하기

HICON GetSharedFolderIcon(HICON hiFolder)
{
HICON hiShared;
HICON hiHand;

ExtractIcon("shell32.dll", 28, &hiand, NULL, 1);

HIMAGELIST himl = ImageList_Create(32,32,ILC_MASK,1,0);

ImageList_AddIcon(himl, hiFolder);
ImageList_AddIcon(himl, hiHand);

HIMAGELIST himlNew = ImageList_Create(himl,0,himl,1,0,0);

hiShared = ImageList_ExtractIcon(0, himlNew, 0);

DestroyIcon(hiHand);

ImageList_Destroy(himl);
ImageList_Destyoy(himlNew);

return hiFolder;
}

+ Recent posts