Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Сохранение курсоров на диске...нэ понимаю:)))


Автор: WM_SASHA 12.8.2008, 00:27
Привет всем!
всюду пишут что курсоры не отличаются от иконок. я не спорю, но не могу понять почему же не работает код, который исправно сохраняет на диске иконки. в msdn указывается что нужно поменять поле на двойку и всё....что то вот не работает...файлы с расширением .cur сохраняются на диске, но только они не распознаются как пиктограммы(как рисунок не открывается). пытался скомпоновать полученный "курсор" со своей тестовой программой. компилятор говорит о старом DIB формате. кстати сколько в shell32.dll курсоров? у меня выводится всего 5, иконов 76(по идендификаторам). 
подскажите пожалуйста.
Код

HANDLE hFile;
     HRSRC hRsrc;
     HGLOBAL hGlobal;
     ICONDIR iconDir;
     ICONDIRENTRY iconDirEntry;
     LPGRPICONDIR lpGrpIconDir;
     LPGRPICONDIRENTRY lpGrpIconDirEntry;
     LPICONIMAGE lpIconImage;
     int nId, iCountChar, iTemp;
     DWORD dwWrittenBytes, dwCountResource, dwTemp=0;
     wchar_t wcDirTemp[256];
     wchar_t wcFileName[50];

         //resourceId глобальная структура, в ней храню описатели и идендификаторы пиктограмм
     nId=resourceId[dwIndexResource].iResourceID;
         //hLib это описатель модуля shell32.dll, пробовал другие экзешники - таже фигня
     hRsrc = FindResource( hLib, MAKEINTRESOURCE( nId ), iResourceType );
     hGlobal = LoadResource( hLib, hRsrc );
     lpGrpIconDir = (LPGRPICONDIR) LockResource( hGlobal );
     lpGrpIconDirEntry=(LPGRPICONDIRENTRY)(lpGrpIconDir+1);//&lpGrpIconDir->idEntries;

//задание структуры ICONDIR
     iconDir.idReserved=0;
     iconDir.idType=2; //это то что написано в мсдн 
     iconDir.idCount=1;

     dwCountResource=lpGrpIconDir->idCount;
        
    iCountChar=wsprintf(wcDirTemp, 
        L"C:\\Documents and Settings\\******(уть ещё чего:)))\\Рабочий стол\\OutputFiles\\int_%d.cur", 
        resourceId[dwIndexResource].iResourceID);

    nId=lpGrpIconDirEntry->nID;
    hRsrc = FindResource( hLib, MAKEINTRESOURCE(nId), RT_CURSOR);//iResourceType-11 );
    hGlobal = LoadResource( hLib, hRsrc);
    lpIconImage =(LPICONIMAGE)LockResource(hGlobal);
    hFile=CreateFile(wcDirTemp, GENERIC_READ|GENERIC_WRITE, 0, NULL,
            CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if(INVALID_HANDLE_VALUE==hFile) return FALSE;         
//подготовка данных и задание структуры ICONDIRENTRY
    iconDirEntry.bHeight=lpGrpIconDirEntry->bHeight;
    iconDirEntry.bWidth=lpGrpIconDirEntry->bWidth;
    iconDirEntry.bColorCount=lpGrpIconDirEntry->bColorCount;
    iconDirEntry.bReserved=0;
    iconDirEntry.wPlanes=lpGrpIconDirEntry->wPlanes;
    iconDirEntry.wBitCount=lpGrpIconDirEntry->wBitCount;
    iconDirEntry.dwBytesInRes=lpGrpIconDirEntry->dwBytesInRes;
    iconDirEntry.dwImageOffset=sizeof(ICONDIR)+sizeof(ICONDIRENTRY);
//запись данных в файл
    WriteFile(hFile, &iconDir, sizeof(ICONDIR), &dwWrittenBytes, FALSE);
    WriteFile(hFile, &iconDirEntry, sizeof(ICONDIRENTRY), &dwWrittenBytes, FALSE);
    WriteFile(hFile, lpIconImage, iconDirEntry.dwBytesInRes, &dwWrittenBytes, FALSE);
    CloseHandle(hFile);

///////////////////////////////////////////////////////////////////////
//другой листинг, где собраны объявления структур
typedef struct
{
    WORD           idReserved;   // Reserved (must be 0)
    WORD           idType;       // Resource Type (1 for icons)
    WORD           idCount;      // How many images?
    //ICONDIRENTRY   idEntries[1]; // An entry for each image (idCount of 'em)
} ICONDIR, *LPICONDIR;

typedef struct
{
    BYTE        bWidth;          // Width, in pixels, of the image
    BYTE        bHeight;         // Height, in pixels, of the image
    BYTE        bColorCount;     // Number of colors in image (0 if >=8bpp)
    BYTE        bReserved;       // Reserved ( must be 0)
    WORD        wPlanes;         // Color Planes
    WORD        wBitCount;       // Bits per pixel
    DWORD       dwBytesInRes;    // How many bytes in this resource?
    DWORD       dwImageOffset;   // Where in the file is this image?
} ICONDIRENTRY, *LPICONDIRENTRY;

typedef struct
{
   BITMAPINFOHEADER   icHeader;   // DIB header
   RGBQUAD         icColors[1];   // Color table
   BYTE            icXOR[1];      // DIB bits for XOR mask
   BYTE            icAND[1];      // DIB bits for AND mask
} ICONIMAGE, *LPICONIMAGE;

#pragma pack( push )
#pragma pack( 2 )
typedef struct
{
   BYTE   bWidth;               // Width, in pixels, of the image
   BYTE   bHeight;              // Height, in pixels, of the image
   BYTE   bColorCount;          // Number of colors in image (0 if >=8bpp)
   BYTE   bReserved;            // Reserved
   WORD   wPlanes;              // Color Planes
   WORD   wBitCount;            // Bits per pixel
   DWORD   dwBytesInRes;         // how many bytes in this resource?
   WORD   nID;                  // the ID
} GRPICONDIRENTRY, *LPGRPICONDIRENTRY;
#pragma pack( pop )

#pragma pack( push )
#pragma pack( 2 )
typedef struct 
{
   WORD            idReserved;   // Reserved (must be 0)
   WORD            idType;       // Resource type (1 for icons)
   WORD            idCount;      // How many images?
   //GRPICONDIRENTRY   idEntries[1]; // The entries for each image
} GRPICONDIR, *LPGRPICONDIR;
#pragma pack( pop )

Автор: fridkaratel 12.8.2008, 01:04
Сколько курсоров, иконок, да и вообще ресурсов в shell32 можно посмотреть через Restorator.

Насчет сохранения (извлечения)... Где-то я видел исходник редактора ресурсов типа Resorator'a, но только не припомню где... Поищи в гугле, вроде как на забугорном сайте...

Автор: WM_SASHA 15.8.2008, 07:20
Цитата(fridkaratel @ 12.8.2008,  01:04)
Сколько курсоров, иконок, да и вообще ресурсов в shell32 можно посмотреть через Restorator.

Насчет сохранения (извлечения)... Где-то я видел исходник редактора ресурсов типа Resorator'a, но только не припомню где... Поищи в гугле, вроде как на забугорном сайте...

 не нашёл. вопрос в силе :(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)