예전에 짰던 지뢰찾기다... -.- 헥사도 짰던 걸로 기억하는데... 소스가 없다 걔는... -.-

Posted by 강군님

댓글을 달아 주세요

void GetFileInfo(LPSTR lpFileName, int *nIndex)
{
 SHFILEINFO sfi;

 int hIcon = SHGetFileInfo(lpFileName, DIRATTR, &sfi, sizeof(SHFILEINFO), 
        SHGFI_TYPENAME | SHGFI_SYSICONINDEX | SHGFI_ICONLOCATION); 
 *nIndex = sfi.iIcon;
 
 lpDesc=(TCHAR *)calloc(sizeof(TCHAR), 1024);
 strcpy(lpDesc, sfi.szTypeName);
}

 

사용자 정의 함수이고, lpFileName으로 들어온 파일이름(절대경로)을 시스템 이미지 리스트에 등록되어 있는 아이콘 인덱스를 찾아서

 

sfi 구조체의 iIcon 이라는 멤버에 값을 넣어주게 됩니다.  아래에 있는 lpDesc에서는 그 파일이 무슨 타입인지(디렉토리라든지 시스템 파일 이라든지 하는 문자열)를 저장하는 전역 변수고요, 사용한 곳에서 free() 시켜줍니다.

 

리스트 뷰의 프로시져에서 다음과 같이 시스템 이미지 리스트를 따옵니다.

 

s_hImageList= (HIMAGELIST)SHGetFileInfo("C:\\",0,&sfi,sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
l_hImageList= (HIMAGELIST)SHGetFileInfo("C:\\",0,&sfi,sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_ICON);
SendMessage(hList, LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)s_hImageList);
SendMessage(hList, LVM_SETIMAGELIST, (WPARAM)LVSIL_NORMAL, (LPARAM)l_hImageList);

 

저는 리스트 뷰에서 구현했기 때문에 이렇게 했습니다.  이렇게 하면 시스템 이미지 리스트를 가져오게 됩니다.  첫번째는 작은 아이콘(16*16), 두번째는 노말한 아이콘(32*32)에 대한 리스트를 따오는 것이구요, 2개의 SendMessage()를 통해서 해당 리스트 뷰에 이미지 리스트를 등록합니다.  다음은 해당 디렉토리의 파일들을 검색하면서 정보를 따오는 부분이고요...

 

LI.mask = LVIF_TEXT | LVIF_IMAGE;

handle = FindFirstFile(fileFound, &ffdata);
 do
    {

      .........

         GetFileInfo(fullName, &iIcon);

         LI.iImage = iIcon;

      ........

         strcpy(LI.pszText, lpDesc);
         free(lpDesc);

    } while (FindNextFile(handle, &ffdata));
 FindClose(handle);

 

아까 정의했던 GetFileInfo를 사용해서 아이콘 인덱스를 가져오고, 해당 파일의 속성을 가져왔습니다.  당근 free() 하구요 :)

Posted by 강군님
TAG icon, Win32API

댓글을 달아 주세요

간만에 일찍 퇴근하고, 기타도 좀 뚱겨보고 책도 좀 들여다보고 티비를 보고 정신없이 웃기도 하다가 갑자기 옛날 네이버 블로그가 생각났다.  젠장... 이거 빨랑 없애버려야지... 좀 나중에 볼만한건 남겨놔야지... 하고 퍼온 것 중 첫번째...


#include <lm.h>

 

#pragma comment (lib,"netapi32.lib")

 

LPSTR GetWorkGroupName(void)

{

    static CHAR sGroup[256];

    

    memset(sGroup, 0x00, 256);

    

    if ( GetVersion() < 0x80000000)                

    {    // WinNT series

        const    DWORD    dwLevel = 102;

        LPSTR    pszServerName = NULL;

        BOOL    fIsDLLLoaded = FALSE;

 

        {

            WKSTA_INFO_102    *pBuf = NULL;

            NET_API_STATUS        nStatus;

 

            nStatus = NetWkstaGetInfo( pszServerName, dwLevel, (LPBYTE*)&pBuf );

 

            if (nStatus == NERR_Success)

            {

                //유니코드를 스트링으로 변환

                WideCharToMultiByte(CP_ACP, 0, (const unsigned short *)pBuf->wki102_langroup,

                            -1, (char *)sGroup, sizeof(sGroup), 0, 0);

            }

 

            if (pBuf != NULL) NetApiBufferFree(pBuf);

        }

    }

    else

    {

        // 9X에서는 레지스트리에서 검색을 해야함..

        LONG result;

        HKEY hKey;      

        DWORD dwType = REG_SZ;  

        DWORD dwSize = 128;

 

        result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\VxD\\VNETSUP",

                            0, KEY_READ, &hKey);

        if (result == ERROR_SUCCESS)

        {

            result = RegQueryValueEx(hKey, "Workgroup", 0, &dwType, (LPBYTE)sGroup, &dwSize);

        }

 

        hKey = NULL;

        RegCloseKey(hKey);

 

 //       int nLen = min(*pdwSize,_tcslen(szTempGroupName));

   //     _tcsncpy( szGroupName, szTempGroupName, nLen  );

     //   szGroupName[nLen] = 0;

       // *pdwSize = nLen;

    }

    return sGroup;

}

Posted by 강군님

댓글을 달아 주세요