分别用VB、Delphi、VC++、ASM四种语言写的一个用UpdateResource修改EXE文件图标的多源码示例

前端之家收集整理的这篇文章主要介绍了分别用VB、Delphi、VC++、ASM四种语言写的一个用UpdateResource修改EXE文件图标的多源码示例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
===============================================
Delphi Code:

===============================================

  1. //请自行添加到 Type 处
  2. PICONDIRENTRY = ^ICONDIRENTRY;
  3. ICONDIRENTRY = packed record
  4. bWidth: Byte;
  5. bHeight: Byte;
  6. bColorCount: Byte;
  7. bReserved: Byte;
  8. wPlanes: Word;
  9. wBitCount: Word;
  10. dwBytesInRes: DWORD;
  11. dwImageOffset: DWORD;
  12. end;
  13.  
  14. PICONDIR = ^ICONDIR;
  15. ICONDIR = packed record
  16. idReserved: Word;
  17. idType: Word;
  18. idCount: Word;
  19. idEntries: ICONDIRENTRY;
  20. end;
  21.  
  22. PGRPICONDIRENTRY = ^GRPICONDIRENTRY;
  23. GRPICONDIRENTRY = packed record
  24. bWidth: Byte;
  25. bHeight: Byte;
  26. bColorCount: Byte;
  27. bReserved: Byte;
  28. wPlanes: Word;
  29. wBitCount: Word;
  30. dwBytesInRes: DWORD;
  31. nID: Word;
  32. end;
  33. PGRPICONDIR = ^GRPICONDIR;
  34. GRPICONDIR = packed record
  35. idReserved: Word;
  36. idType: Word;
  37. idCount: Word;
  38. idEntries: GRPICONDIRENTRY;
  39. end;
  40. //////////////////////////////////////////////
  41. //函数说明:修改EXE图标
  42. //
  43. //参 数:IconFile 图标文件
  44. // ExeFile 被修改的EXE文件
  45. //
  46. //返回值: 成功为True,否则False
  47. /////////////////////////////////////////////
  48. function ChangeExeIcon(IcoFile,ExeFile: string): Boolean;
  49. var
  50. stID: ICONDIR;
  51. stGID: GRPICONDIR;
  52.  
  53. pGrpIcon: PBYTE;
  54. pIcon: PBYTE;
  55. hUpdate: DWORD;
  56. nSize,nGSize: DWORD;
  57. hFile: THandle;
  58. dwReserved: DWORD;
  59. ret: Boolean;
  60. begin
  61. Result := False;
  62.  
  63. hFile := CreateFile(PChar(IcoFile),GENERIC_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  64. if hFile = INVALID_HANDLE_VALUE then
  65. Exit;
  66. try
  67. ReadFile(hFile,stID,Sizeof(ICONDIR),dwReserved,nil);
  68. nSize := stID.idEntries.dwBytesInRes;
  69. GetMem(pIcon,nSize);
  70. SetFilePointer(hFile,stID.idEntries.dwImageOffset,FILE_BEGIN);
  71. ReadFile(hFile,pIcon^,nSize,nil);
  72. stGID.idType := 1;
  73. stGID.idCount := stID.idCount;
  74. stGID.idReserved := 0;
  75. CopyMemory(@stGID.idEntries.bWidth,@stID.idEntries.bWidth,12);
  76. stGID.idEntries.nID := 0;
  77. nGSize := Sizeof(GRPICONDIR);
  78. GetMem(pGrpIcon,nGSize);
  79. CopyMemory(pGrpIcon,@stGID,nGSize);
  80. hUpdate := BeginUpdateResource(PChar(ExeFile),False);
  81. try
  82. ret := UpdateResource(hUpdate,RT_GROUP_ICON,MAKEINTRESOURCE(1),pGrpIcon,nGSize);
  83. ret := UpdateResource(hUpdate,RT_ICON,pIcon,nSize);
  84. finally
  85. EndUpdateResource(hUpdate,False);
  86. end;
  87. finally
  88. CloseHandle(hFile);
  89. end;
  90. Result := ret;
  91. end;

===============================================
VB Code:
===============================================
  1. Option Explicit
  2. Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String,ByVal dwDesiredAccess As Long,ByVal dwShareMode As Long,lpSecurityAttributes As Any,ByVal dwCreationDisposition As Long,ByVal dwFlagsAndAttributes As Long,ByVal hTemplateFile As Long) As Long
  3. Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long,lpBuffer As Any,ByVal nNumberOfBytesToRead As Long,lpNumberOfBytesRead As Long,lpOverlapped As Any) As Long
  4. Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long,ByVal lDistanceToMove As Long,lpDistanceToMoveHigh As Long,ByVal dwMoveMethod As Long) As Long
  5. Private Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String,ByVal bDeleteExistingResources As Long) As Long
  6. Private Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (ByVal hUpdate As Long,ByVal lpType As Long,ByVal lpName As Long,ByVal wLanguage As Long,lpData As Any,ByVal cbData As Long) As Long
  7. Private Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (ByVal hUpdate As Long,ByVal fDiscard As Long) As Long
  8. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  9. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any,Source As Any,ByVal Length As Long)
  10. Private Declare Function GetLastError Lib "kernel32" () As Long
  11. Private Const INVALID_HANDLE_VALUE = -1
  12. Private Const GENERIC_READ = &H80000000
  13. Private Const FILE_ATTRIBUTE_NORMAL = &H80
  14. Private Const FILE_BEGIN = 0
  15. Private Const OPEN_EXISTING = 3
  16. Private Const RT_ICON = 3&
  17. Private Const DIFFERENCE As Long = 11
  18. Private Const RT_GROUP_ICON As Long = (RT_ICON + DIFFERENCE)
  19.  
  20. Private Type ICONDIRENTRY
  21. bWidth As Byte
  22. bHeight As Byte
  23. bColorCount As Byte
  24. bReserved As Byte
  25. wPlanes As Integer
  26. wBitCount As Integer
  27. dwBytesInRes As Long
  28. dwImageOffset As Long
  29. End Type
  30. Private Type ICONDIR
  31. idReserved As Integer
  32. idType As Integer
  33. idCount As Integer
  34. 'idEntries As ICONDIRENTRY
  35. End Type
  36. Private Type GRPICONDIRENTRY
  37. bWidth As Byte
  38. bHeight As Byte
  39. bColorCount As Byte
  40. bReserved As Byte
  41. wPlanes As Integer
  42. wBitCount As Integer
  43. dwBytesInRes As Long
  44. nID As Integer
  45. End Type
  46. Private Type GRPICONDIR
  47. idReserved As Integer
  48. idType As Integer
  49. idCount As Integer
  50. idEntries As GRPICONDIRENTRY
  51. End Type
  52. '//////////////////////////////////////////////
  53. '//函数说明:修改EXE图标
  54. '//
  55. '//参 数:IconFile 图标文件
  56. '// ExeFile 被修改的EXE文件
  57. '//
  58. '//返回值: 成功为True,否则False
  59. '/////////////////////////////////////////////////////
  60. Private Function ChangeExeIcon(ByVal IconFile As String,ByVal ExeFile As String) As Boolean
  61. On Error GoTo cw
  62. Dim stID As ICONDIR
  63. Dim stIDE As ICONDIRENTRY
  64. Dim stGID As GRPICONDIR
  65. Dim hFile As Long
  66. Dim pIcon() As Byte,pGrpIcon() As Byte
  67. Dim nSize As Long,nGSize As Long
  68. Dim dwReserved As Long
  69. Dim hUpdate As Long
  70. Dim ret As Long
  71. hFile = CreateFile(IconFile,ByVal 0&,0)
  72. If hFile = INVALID_HANDLE_VALUE Then Exit Function
  73. ret = ReadFile(hFile,Len(stID),ByVal 0&)
  74. If ret = 0 Then GoTo cw
  75. ret = ReadFile(hFile,stIDE,Len(stIDE),ByVal 0&)
  76. nSize = stIDE.dwBytesInRes
  77. ReDim pIcon(nSize - 1)
  78. SetFilePointer hFile,stIDE.dwImageOffset,FILE_BEGIN
  79. ret = ReadFile(hFile,pIcon(0),ByVal 0&)
  80. If ret = 0 Then GoTo cw
  81. With stGID
  82. .idType = 1
  83. .idCount = stID.idCount
  84. .idReserved = 0
  85. CopyMemory stGID.idEntries,12
  86. .idEntries.nID = 0
  87. End With
  88. nGSize = Len(stGID)
  89. ReDim pGrpIcon(nGSize - 1)
  90. CopyMemory pGrpIcon(0),stGID,nGSize
  91. hUpdate = BeginUpdateResource(ExeFile,False)
  92. ret = UpdateResource(hUpdate,1,pGrpIcon(0),nGSize)
  93. ret = UpdateResource(hUpdate,nSize)
  94. EndUpdateResource hUpdate,False
  95. If ret = 0 Then GoTo cw
  96. ChangeExeIcon = True
  97. cw:
  98. CloseHandle hFile
  99. End Function
===============================================
VC++ Code:
===============================================
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <tchar.h>
  4.  
  5. struct ICONDIRENTRY
  6. {
  7. BYTE bWidth;
  8. BYTE bHeight;
  9. BYTE bColorCount;
  10. BYTE bReserved;
  11. WORD wPlanes;
  12. WORD wBitCount;
  13. DWORD dwBytesInRes;
  14. DWORD dwImageOffset;
  15. };
  16.  
  17. struct ICONDIR
  18. {
  19. WORD idReserved;
  20. WORD idType;
  21. WORD idCount;
  22. //ICONDIRENTRY idEntries;
  23. };
  24.  
  25. struct GRPICONDIRENTRY
  26. {
  27. BYTE bWidth;
  28. BYTE bHeight;
  29. BYTE bColorCount;
  30. BYTE bReserved;
  31. WORD wPlanes;
  32. WORD wBitCount;
  33. DWORD dwBytesInRes;
  34. WORD nID;
  35. };
  36. struct GRPICONDIR
  37. {
  38. WORD idReserved;
  39. WORD idType;
  40. WORD idCount;
  41. GRPICONDIRENTRY idEntries;
  42. };
  43.  
  44. //////////////////////////////////////////////
  45. //函数说明:修改EXE图标
  46. //
  47. //参 数:IconFile 图标文件
  48. // ExeFile 被修改的EXE文件
  49. //
  50. //返回值: 成功为True,否则False
  51. /////////////////////////////////////////////
  52. bool ChangeExeIcon(LPWSTR IconFile,LPWSTR ExeFile)
  53. {
  54. ICONDIR stID;
  55. ICONDIRENTRY stIDE;
  56. GRPICONDIR stGID;
  57. HANDLE hFile;
  58. DWORD nSize,nGSize,dwReserved;
  59. HANDLE hUpdate;
  60. PBYTE pIcon,pGrpIcon;
  61. BOOL ret;
  62. hFile = CreateFile(IconFile,NULL,NULL);
  63. if (hFile == INVALID_HANDLE_VALUE)
  64. {
  65. return false;
  66. }
  67. ZeroMemory(&stID,sizeof(ICONDIR));
  68. ret = ReadFile(hFile,&stID,sizeof(ICONDIR),&dwReserved,NULL);
  69. ZeroMemory(&stIDE,sizeof(ICONDIRENTRY));
  70. ret = ReadFile(hFile,&stIDE,sizeof(ICONDIRENTRY),NULL);
  71. nSize = stIDE.dwBytesInRes;
  72. pIcon = (PBYTE)malloc(nSize);
  73. SetFilePointer(hFile,FILE_BEGIN);
  74. ret = ReadFile(hFile,(LPVOID)pIcon,NULL);
  75. if (!ret)
  76. {
  77. CloseHandle(hFile);
  78. return false;
  79. }
  80. ZeroMemory(&stGID,sizeof(GRPICONDIR));
  81. stGID.idCount = stID.idCount;
  82. stGID.idReserved = 0;
  83. stGID.idType = 1;
  84. CopyMemory(&stGID.idEntries,12);
  85. stGID.idEntries.nID = 0;
  86. nGSize = sizeof(GRPICONDIR);
  87. pGrpIcon = (PBYTE)malloc(nGSize);
  88. CopyMemory(pGrpIcon,&stGID,nGSize);
  89.  
  90. hUpdate = BeginUpdateResource(ExeFile,false);
  91. ret = UpdateResource(hUpdate,(LPVOID)pGrpIcon,nGSize);
  92. ret = UpdateResource(hUpdate,nSize);
  93. EndUpdateResource(hUpdate,false);
  94. if (!ret)
  95. {
  96. CloseHandle(hFile);
  97. return false;
  98. }
  99. CloseHandle(hFile);
  100. return true;
  101. }

===============================================
ASM Code:
===============================================
  1. .386
  2. .model flat,stdcall
  3. option casemap:none
  4. include windows.inc
  5. include user32.inc
  6. includelib user32.lib
  7. include kernel32.inc
  8. includelib kernel32.lib
  9. ICONDIRENTRY STRUCT
  10. bWidth BYTE ?
  11. bHeight BYTE ?
  12. bColorCount BYTE ?
  13. bReserved BYTE ?
  14. wPlanes WORD ?
  15. wBitCount WORD ?
  16. dwBytesInRes DWORD ?
  17. dwImageOffset DWORD ?
  18. ICONDIRENTRY ENDS
  19. ICONDIR STRUCT
  20. idReserved WORD ?
  21. idType WORD ?
  22. idCount WORD ?
  23. ;idEntries ICONDIRENTRY <>
  24. ICONDIR ENDS
  25. GRPICONDIRENTRY STRUCT
  26. bWidth BYTE ?
  27. bHeight BYTE ?
  28. bColorCount BYTE ?
  29. bReserved BYTE ?
  30. wPlanes WORD ?
  31. wBitCount WORD ?
  32. dwBytesInRes DWORD ?
  33. nID WORD ?
  34. GRPICONDIRENTRY ENDS
  35. GRPICONDIR STRUCT
  36. idReserved WORD ?
  37. idType WORD ?
  38. idCount WORD ?
  39. idEntries GRPICONDIRENTRY <>
  40. GRPICONDIR ENDS
  41. .data
  42. szIcon db 'a.ico',0
  43. szFile db 'a.exe',0
  44. .code
  45. //////////////////////////////////////////////
  46. //函数说明:修改EXE图标
  47. //
  48. //参 数:IconFile 图标文件
  49. // ExeFile 被修改的EXE文件
  50. //
  51. //返回值: 成功为True,否则False
  52. /////////////////////////////////////////////
  53. _ChangeExeIcon proc IconFile,ExeFile
  54.  
  55. local @stID: ICONDIR
  56. local @stIDE: ICONDIRENTRY
  57. local @stGID: GRPICONDIR
  58. local @hFile: DWORD
  59. local @dwReserved: DWORD
  60. local @nSize: DWORD
  61. local @nGSize: DWORD
  62. local @pIcon: DWORD
  63. local @pGrpIcon: DWORD
  64. local @hUpdate: DWORD
  65. local @ret: DWORD
  66.  
  67. invoke CreateFile,IconFile,NULL
  68. mov @hFile,eax
  69. .if eax == INVALID_HANDLE_VALUE
  70. xor eax,eax
  71. ret
  72. .endif
  73.  
  74. invoke RtlZeroMemory,addr @stID,sizeof @stID
  75. invoke ReadFile,@hFile,sizeof @stID,addr @dwReserved,NULL
  76. invoke RtlZeroMemory,addr @stIDE,sizeof @stIDE
  77. invoke ReadFile,sizeof @stIDE,NULL
  78.  
  79. push @stIDE.dwBytesInRes
  80. pop @nSize
  81. invoke GlobalAlloc,GPTR,@nSize
  82. mov @pIcon,eax
  83. invoke SetFilePointer,@stIDE.dwImageOffset,FILE_BEGIN
  84. invoke ReadFile,@pIcon,@nSize,NULL
  85. cmp eax,0
  86. je err
  87. invoke RtlZeroMemory,addr @stGID,sizeof @stGID
  88. push @stID.idCount
  89. pop @stGID.idCount
  90. mov @stGID.idReserved,0
  91. mov @stGID.idType,1
  92. invoke RtlMoveMemory,addr @stGID.idEntries,12
  93. mov @stGID.idEntries.nID,0
  94. mov @nGSize,sizeof @stGID
  95. invoke GlobalAlloc,@nGSize
  96. mov @pGrpIcon,eax
  97. invoke RtlMoveMemory,@pGrpIcon,@nGSize
  98.  
  99. ;开始修改
  100. invoke BeginUpdateResource,ExeFile,FALSE
  101. mov @hUpdate,eax
  102. invoke UpdateResource,@hUpdate,@nGSize
  103. invoke UpdateResource,@nSize
  104. mov @ret,eax
  105. invoke EndUpdateResource,FALSE
  106. .if @ret == FALSE
  107. jmp err
  108. .endif
  109. ;成功后到此一日游
  110. invoke GlobalFree,@pIcon
  111. invoke CloseHandle,@hFile
  112. mov eax,1
  113. ret
  114. err:
  115. ;失败后到此一日游
  116. invoke GlobalFree,@hFile
  117. xor eax,eax
  118. ret
  119. _ChangeExeIcon endp
  120. ;==========================程序入口=============================
  121. start:
  122.  
  123. invoke _ChangeExeIcon,offset szIcon,offset szFile
  124. invoke ExitProcess,NULL
  125. end start
原文:http://download.csdn.net/download/domaryj/5775353

猜你在找的VB相关文章