Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: ExtractIcon và hàm CopyIcon để đổi icon của 1 chương trình

  1. #1
    Ngày gia nhập
    10 2008
    Nơi ở
    sài gòn
    Bài viết
    422

    Angry ExtractIcon và hàm CopyIcon để đổi icon của 1 chương trình

    Code:
    #include<windows.h>
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
    {
    	HICON hIcon = ExtractIcon(hInstance,"C:\\WINDOWS\\explorer.exe",1);
    	CopyIcon(hIcon);
    	return 0;
    }
    mình thử đổi icon của chương trình bằng icon của File C:\\WINDOWS\\explorer.exe,nhưng khong được,mình cũng đã tạo File Resource vào File chương trình rồi mà nó không đổi được icon của chương trình ,lạ quá

  2. #2
    Ngày gia nhập
    10 2008
    Nơi ở
    sài gòn
    Bài viết
    422

    PHP Code:
    /*

    Miranda IM: the free IM client for Microsoft* Windows*

    Copyright 2000-2009 Miranda ICQ/IM project,
    all portions of this codebase are copyrighted to the people
    listed in contributors.txt.

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    */
    #include <windows.h>
    #ifdef _ASSERT
    #undef _ASSERT
    #endif
    #define _ASSERT(n)
    typedef struct
    {
            
    WORD    Reserved;
            
    WORD    ResType;
            
    WORD    ResCount;
    }
            
    NEWHEADER;

    #define MAGIC_ICON       0
    #define MAGIC_ICO1       1
    #define MAGIC_CUR        2
    #define MAGIC_BMP        ((WORD)'B'+((WORD)'M'<<8))

    #define MAGIC_ANI1       ((WORD)'R'+((WORD)'I'<<8))
    #define MAGIC_ANI2       ((WORD)'F'+((WORD)'F'<<8))
    #define MAGIC_ANI3       ((WORD)'A'+((WORD)'C'<<8))
    #define MAGIC_ANI4       ((WORD)'O'+((WORD)'N'<<8))

    #define VER30            0x00030000

    void_RelativeVirtualAddresstoPtr(IMAGE_DOS_HEADERpDosHeaderDWORD rva)
    {
            
    IMAGE_NT_HEADERSpPE = (IMAGE_NT_HEADERS*)((BYTE*)pDosHeader pDosHeader->e_lfanew);
            
    IMAGE_SECTION_HEADERpSection IMAGE_FIRST_SECTIONpPE );
            
    int i;

            for (
    0pPE->FileHeader.NumberOfSectionsi++) {
                    
    IMAGE_SECTION_HEADERcSection = &pSection[i];
                    
    DWORD size cSection->Misc.VirtualSize cSection->Misc.VirtualSize cSection->SizeOfRawData;

                    if (
    rva >= cSection->VirtualAddress && rva <  cSection->VirtualAddress size)
                            return (
    LPBYTE)pDosHeader cSection->PointerToRawData + (rva cSection->VirtualAddress);
            }

            return 
    NULL;
    }

    void_GetResourceTable(IMAGE_DOS_HEADERpDosHeader)
    {
            
    IMAGE_NT_HEADERSpPE = (IMAGE_NT_HEADERS*)((BYTE*)pDosHeader pDosHeader->e_lfanew);

            if (
    pPE->Signature != IMAGE_NT_SIGNATURE)
                    return 
    NULL;
            if (
    pPE->FileHeader.SizeOfOptionalHeader 2)
                    return 
    NULL;

            
    // The DataDirectory is an array of 16 structures.
            // Each array entry has a predefined meaning for what it refers to.

            
    switch (pPE->OptionalHeader.Magic)
            {
            case 
    IMAGE_NT_OPTIONAL_HDR32_MAGIC:
                    if (
    pPE->FileHeader.SizeOfOptionalHeader >= sizeof(IMAGE_OPTIONAL_HEADER32))
                            return 
    _RelativeVirtualAddresstoPtr(pDosHeader, ((PIMAGE_NT_HEADERS32)pPE)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress);
                    break;

            case 
    IMAGE_NT_OPTIONAL_HDR64_MAGIC:
                    if (
    pPE->FileHeader.SizeOfOptionalHeader >= sizeof(IMAGE_OPTIONAL_HEADER64))
                            return 
    _RelativeVirtualAddresstoPtr(pDosHeader, ((PIMAGE_NT_HEADERS64)pPE)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress);
                    break;
            }

            return 
    NULL;
    }

    IMAGE_RESOURCE_DIRECTORY_ENTRY_FindResourceBase(voidprtint resTypeintpCount)
    {
            
    IMAGE_RESOURCE_DIRECTORYpDir = (IMAGE_RESOURCE_DIRECTORY*)prt;
            
    IMAGE_RESOURCE_DIRECTORY_ENTRYpRes;
            
    int icount;

            *
    pCount 0;

            
    count pDir->NumberOfIdEntries pDir->NumberOfNamedEntries;
            
    pRes = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)(pDir+1);

            for(
    0counti++)
                    if (
    pRes[i].Name == (DWORD)resType) break;

            if (
    == count) return NULL;

            
    pDir = (IMAGE_RESOURCE_DIRECTORY*)((LPBYTE)prt +
                    (
    pRes[i].OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY));

            
    count  pDir->NumberOfIdEntries pDir->NumberOfNamedEntries;
            *
    pCount count;
            
    pRes = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)(pDir+1);

            return 
    pRes;
    }

    int _FindResourceCount(voidprtint resType)
    {
            
    int count;

            
    _FindResourceBase(prtresType, &count);
            return 
    count;
    }

    void_FindResource(IMAGE_DOS_HEADERpDosHeadervoidprtint resIndexint resTypeDWORDpcbSize)
    {
            
    int countindex 0;
            
    IMAGE_RESOURCE_DIRECTORY_ENTRYpRes;
            
    IMAGE_RESOURCE_DATA_ENTRYpEntry;

            
    pRes _FindResourceBase(prtresType, &count);
            if (
    resIndex 0) {
                    for(
    index 0index countindex++)
                            if (
    pRes[index].Name == (DWORD)(-resIndex))
                                    break;
            }
            else 
    index resIndex;

            if (
    index >= count)
                    return 
    NULL;

            if (
    pRes[index].OffsetToData IMAGE_RESOURCE_DATA_IS_DIRECTORY) {
                    
    IMAGE_RESOURCE_DIRECTORYpDir;
                    
    pDir = (IMAGE_RESOURCE_DIRECTORY*)((LPBYTE)prt + (pRes[index].OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY) );
                    
    pRes = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)(pDir+1);
                    
    index 0;  
            }

            if ( 
    pRes[index].OffsetToData IMAGE_RESOURCE_DATA_IS_DIRECTORY )
                    return 
    NULL;

            
    pEntry = (IMAGE_RESOURCE_DATA_ENTRY*)((LPBYTE)prt pRes[index].OffsetToData);
            *
    pcbSize pEntry->Size;
            return 
    _RelativeVirtualAddresstoPtr(pDosHeaderpEntry->OffsetToData);
    }

    UINT _ExtractFromExe(HANDLE hFileint iconIndexint cxIconSizeint cyIconSizeHICON *phiconUINT flags)
    {
            
    int retval 0;
            
    DWORD fileLen GetFileSize(hFileNULL);
            
    HANDLE hFileMap INVALID_HANDLE_VALUEpFile NULL;
            
    IMAGE_DOS_HEADERpDosHeader;
            
    voidpRes;
            
    DWORD cbSize 0;
            
    NEWHEADERpIconDir;
            
    int idIcon;
            
    LPBITMAPINFOHEADER pIcon;
            
    //  UINT res = 0;

            
    hFileMap CreateFileMapping(hFileNULLPAGE_READONLY00NULL);
            if (
    hFileMap == NULL) goto cleanup;

            
    pFile MapViewOfFile(hFileMapFILE_MAP_READ000);
            if (
    pFile == NULL) goto cleanup;

            
    pDosHeader = (IMAGE_DOS_HEADER*)(void*)pFile;
            if (
    pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) goto cleanup;
            if (
    pDosHeader->e_lfanew <= 0) goto cleanup;
            if ((
    DWORD)(pDosHeader->e_lfanew) >= fileLen) goto cleanup;

            
    pRes _GetResourceTable(pDosHeader);
            if (!
    pRes) goto cleanup;
            if (!
    phicon) {
                    
    retval _FindResourceCount(pRes, (int)RT_GROUP_ICON);
                    goto 
    cleanup;
            }

            
    pIconDir = (NEWHEADER*)_FindResource(pDosHeaderpResiconIndex, (int)RT_GROUP_ICON, &cbSize);
            if (!
    pIconDir) goto cleanup;
            if (
    pIconDir->Reserved || pIconDir->ResType != RES_ICON) goto cleanup;

            
    idIcon LookupIconIdFromDirectoryEx((LPBYTE)pIconDirTRUEcxIconSizecyIconSizeflags);
            
    pIcon = (LPBITMAPINFOHEADER)_FindResource(pDosHeaderpRes, -idIcon, (int)RT_ICON, &cbSize);
            if (!
    pIcon) goto cleanup;

            if ( 
    pIcon->biSize != sizeof(BITMAPINFOHEADER) && pIcon->biSize != sizeof(BITMAPCOREHEADER)) {
                    
    _ASSERT(0);
                    goto 
    cleanup;
            }
            *
    phicon CreateIconFromResourceEx((LPBYTE)pIconcbSizeTRUEVER30cxIconSizecyIconSizeflags);
            
    retval 1;
    cleanup:
            if (
    pFileUnmapViewOfFile(pFile);
            if (
    hFileMap != INVALID_HANDLE_VALUECloseHandle(hFileMap);

            return 
    retval;
    }
    UINT _ExtractFromICOLPCTSTR pFileNameint iconIndexint cxIconint cyIconHICONphiconUINT flags )
    {
            
    HICON hicon;

            if ( 
    iconIndex >= )
                    return 
    0;

            
    //  do we just want a count?
            
    if (!phicon)
                    return 
    1;

            
    flags |= LR_LOADFROMFILE;
            
    hicon = (HICON)LoadImageNULLpFileNameIMAGE_ICONcxIconcyIconflags );
            if (!
    hicon)
                    return 
    0;

            *
    phicon hicon;
            return 
    1;
    }

    UINT _ExtractIconEx(LPCTSTR lpszFileint iconIndexint cxIconint cyIconHICON *phiconUINT flags)
    {
            
    HANDLE hFile;
            
    WORD magic[6];
            
    DWORD read 0;
            
    UINT res 0;

            if (
    cxIcon == GetSystemMetrics(SM_CXICON) && cyIcon == GetSystemMetrics(SM_CYICON))
                    
    res ExtractIconEx(lpszFileiconIndexphiconNULL1);
            else if (
    cxIcon == GetSystemMetrics(SM_CXSMICON) && cyIcon == GetSystemMetrics(SM_CYSMICON))
                    
    res ExtractIconEx(lpszFileiconIndexNULLphicon1);
            
    // check if the api succeded, if not try our method too
            
    if (res) return res;

            
    hFile CreateFile(lpszFileGENERIC_READFILE_SHARE_READNULLOPEN_EXISTINGFILE_ATTRIBUTE_NORMAL0);
            if (
    hFile == INVALID_HANDLE_VALUE)
                    return 
    0;

            
    // failed to read file signature
            
    if ( !ReadFile(hFile,&magicsizeof(magic), &readNULL ) || (read != sizeof(magic))) {
                    
    CloseHandle(hFile);
                    return 
    0;
            }

            switch ( 
    magic[0] ) {
            case 
    IMAGE_DOS_SIGNATURE:
                    
    res _ExtractFromExe(hFileiconIndexcxIconcyIconphiconflags);
                    break;

            case 
    MAGIC_ANI1//  ani cursors are RIFF file of type 'ACON'
                    
    if (magic[1] == MAGIC_ANI2 && magic[4] == MAGIC_ANI3 && magic[5] == MAGIC_ANI4)
                            
    res _ExtractFromICO(lpszFileiconIndexcxIconcyIconphiconflags);
                    break;

            case 
    MAGIC_ICON:    
                    if ((
    magic[1] == MAGIC_ICO1 || magic[1] == MAGIC_CUR ) && magic[2] >= )
                            
    res _ExtractFromICO(lpszFileiconIndexcxIconcyIconphiconflags);

                    break;
            }

            
    CloseHandle(hFile);
            return 
    res;
    }
    int WINAPI WinMain__in HINSTANCE hInstance__in_opt HINSTANCE hPrevInstance__in_opt LPSTR lpCmdLine__in int nShowCmd )
    {
        
    //_ExtractIconEx(hFile , 2, size, item->cy, &item->icon, LR_COLOR );
        
    return 0;

    Đã được chỉnh sửa lần cuối bởi haian : 08-02-2010 lúc 04:23 PM.

  3. #3
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Cậu đọc lại cho kỹ trong MSDN phần Icon, đọc kỹ help của ExtractIcon và CopyIcon lại đã.
    Phải tập bò rồi mới tập đi, tập chạy. Kiến thức lập trình Windows API của cậu còn yếu lắm.

  4. #4
    Ngày gia nhập
    06 2008
    Bài viết
    11

    Có ai biết cách thao tác với 1 icon (như là vẽ vào đó chẳng hạn) khi biết hIcon của nó không? Mình coi trong MSDN mãi mà chẳng biết làm sao

  5. #5
    Ngày gia nhập
    10 2008
    Nơi ở
    sài gòn
    Bài viết
    422

    Code:
    Có ai biết cách thao tác với 1 icon (như là vẽ vào đó chẳng hạn) khi biết hIcon của nó không? Mình coi trong MSDN mãi mà chẳng biết làm sao
    bạn dùng drawnDC

    Code:
    #include<windows.h>
    int NEAR  SaveMyIcon( HICON hIcon)
    {
    	int       fh;
    	UINT      uiSize;
    	DWORD     dwSize;
    	OFSTRUCT  of;    if (!hIcon)
    		return FALSE; 
    	dwSize  = GlobalSize(HGLOBAL(hIcon));
    	void* lpGMem;
    	lpGMem = GlobalLock(hIcon);
    	return 0
    }
    
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
    {
    	HICON hIconAppSmall;
    	hIconAppSmall = ExtractIcon (hInstance,"D:\\1.exe", 0);
    	//CreateIconFromResourceEx()
    	SaveMyIcon(hIconAppSmall);
    	return 0;
    }
    ai biết cahcs nào lấy được size của HICON không

    chỗ này nó cứ báo không lấy được hoài

    dwSize = GlobalSize(HGLOBAL(hIcon));
    void* lpGMem;
    lpGMem = GlobalLock(hIcon);

  6. #6
    Ngày gia nhập
    04 2009
    Nơi ở
    một căn hộ nhỏ trên trái đất
    Bài viết
    372

    Mặc định ExtractIcon và hàm CopyIcon để đổi icon của 1 chương trình

    Trích dẫn Nguyên bản được gửi bởi haian Xem bài viết
    Code:
    Có ai biết cách thao tác với 1 icon (như là vẽ vào đó chẳng hạn) khi biết hIcon của nó không? Mình coi trong MSDN mãi mà chẳng biết làm sao
    bạn dùng drawnDC

    Code:
    #include<windows.h>
    int NEAR  SaveMyIcon( HICON hIcon)
    {
    	int       fh;
    	UINT      uiSize;
    	DWORD     dwSize;
    	OFSTRUCT  of;    if (!hIcon)
    		return FALSE; 
    	dwSize  = GlobalSize(HGLOBAL(hIcon));
    	void* lpGMem;
    	lpGMem = GlobalLock(hIcon);
    	return 0
    }
    
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
    {
    	HICON hIconAppSmall;
    	hIconAppSmall = ExtractIcon (hInstance,"D:\\1.exe", 0);
    	//CreateIconFromResourceEx()
    	SaveMyIcon(hIconAppSmall);
    	return 0;
    }
    ai biết cahcs nào lấy được size của HICON không

    chỗ này nó cứ báo không lấy được hoài

    dwSize = GlobalSize(HGLOBAL(hIcon));
    void* lpGMem;
    lpGMem = GlobalLock(hIcon);
    Cậu có thực sự hiểu những gì cậu nói không?
    Being top programmers always requires advanced knowledge of C/C++ and assembly


Các đề tài tương tự

  1. Làm sao để tạo icon cho file exe của mình trong resoure icon?
    Gửi bởi luongtankhang123 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 25-01-2012, 07:54 PM
  2. Graphic Thắc mắc Icon bị nhòe khi chọn Large Icon trong ListView
    Gửi bởi manocanh trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 16-04-2011, 11:36 PM
  3. Tạo icon cho một đối tượng ListViewItem bằng icon của ứng dụng thực thi
    Gửi bởi windy2901 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 24-03-2011, 01:09 PM
  4. sử dụng hàm ExtractIcon() để so sánh 2 icon với nhau
    Gửi bởi Cpro trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 11
    Bài viết cuối: 02-12-2008, 10:09 PM
  5. [Icon] Bộ icon hỗ trợ visual studio 2005
    Gửi bởi nhc1987 trong diễn đàn Công cụ, ebooks C#, ASP.NET, và Windows Mobile
    Trả lời: 4
    Bài viết cuối: 13-05-2008, 10:41 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn