无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: mdyblog
打印 上一主题 下一主题

[更新376#2825]PECMD2012.1.80.13_Win32_64.多窗口多线程.裸机系统2.3.3.1+18M酷M...

    [复制链接]
19501#
发表于 2025-11-20 16:54:05 来自手机 | 只看该作者
回复

使用道具 举报

19502#
发表于 2025-11-20 16:54:19 来自手机 | 只看该作者
学习学习
回复

使用道具 举报

19503#
发表于 2025-11-20 16:54:31 来自手机 | 只看该作者
学习学习
回复

使用道具 举报

19504#
发表于 2025-11-20 16:54:44 来自手机 | 只看该作者
学习学习
回复

使用道具 举报

19505#
发表于 2025-11-26 12:07:23 | 只看该作者
感谢楼主分享,感谢!!!!
回复

使用道具 举报

19506#
发表于 2025-12-4 21:04:29 | 只看该作者
用PECMD怎么调用CMD把INI文件打包成EXE,具体用什么参数命令,哪个版本才有这个功能。哪位大婶指点指点。
回复

使用道具 举报

19507#
发表于 2025-12-6 19:44:52 | 只看该作者
写了个软件安装管理器,根据列表文件list.ini文件里的内容自动创建复选框,软件数量不固定,预设的swin太大滚动条下面会空很多,swin太小会放不下,代码如下:

  1. _SUB MainWindow,W300H360,软件列表选择,,%windir%\system32\shell32.dll#316,15,,-top -disminb
  2.     SWIN SWIN1:Page11:-SWINMAIN,L10T33W273H240,,0x140
  3.     ENVI @SWINMAIN:SWIN1.ID=?&Swin1_Wid   //画框ID
  4.     ENVI @SWINMAIN.ID=?&SWINMAIN_Wid    //与Page11窗口ID相同%&Page1_WID%
  5.     LABE TitleLabel,L10T10W200H20,请选择要安装的软件:
  6.     ITEM OKButton,L120T280W60H30,安装,CALL OnOK
  7. _END

  8. _SUB Page11,W600H240,,,,:0xFFFFFF
  9.     ENVI &YPos=10
  10.     ENVI &Index=0
  11.     ENVI &inList=0
  12.     ENVI AllList=
  13.     SET$ NL=0D 0A

  14.     READ list.ini,*,&&AllContent

  15.     FORX *NL &AllContent,&&line,
  16.     {
  17.         mstr * &line1=1,1,&line
  18.         find $%&line1%=[,
  19.         {
  20.             find $%&line%=[softlist], ENVI &inList=1!ENVI &inList=0
  21.         }!
  22.         {
  23.             IFEX $%&inList%=1,
  24.             {
  25.                 FIND $%&line%=, exit -

  26.                 // 解析软件名称、路径、默认是否选中
  27.                 MSTR * -delims:| SoftName,SoftPath,SoftStatus=<1><2><3>&line

  28.                 CHEK Checkbox_%&Index%,L40T%&YPos%W250H20,%SoftName%
  29.                 IFEX $%SoftStatus%=0,ENVI @Checkbox_%&Index%.Check=1
  30.                 IFEX $%SoftStatus%=2,team ENVI @Checkbox_%&Index%.Check=1|ENVI @Checkbox_%&Index%.Enable=0

  31.                 ENVI &Checkbox_Name=Checkbox_%&Index%
  32.                 ENVI &Checkbox_Name_Path=%SoftPath%
  33.                 ENVI Checkbox_Name_Status=%SoftStatus%

  34.                 CALC &YPos=%&YPos% + 25
  35.                 CALC &Index=%&Index% + 1

  36.                 ENVI AllList=%Checkbox_Name_Path%%NL%%AllList%
  37.                 //mess %&AllList%
  38.                 //mess %Checkbox_Name%:%&SoftName%:%&Checkbox_Name_Path%:%Checkbox_Name_Status%
  39.             }
  40.         }
  41.     }

  42.     ENVI TotalCount=%&Index%

  43.     //MESS %TotalCount%
  44.     IFEX #%TotalCount%>=9,TEAM  MESS %H%|CALC H=(%TotalCount%-9)*35+%H%| MESS %H%|ENVI @@POS=%&SWIN1_Wid%::::%H%

  45. _END

  46. _SUB OnOK
  47. ENVI &AllList=%AllList%
  48. ENVI &InstPath=
  49. ENVI &Index=0

  50.     LOOP #%&Index% <= %TotalCount%,
  51.     {
  52.         READ  -*,%&Index%,&InstPath,&AllList
  53.         Find $%Checkbox_%&Index%.Check%=1,mess Checkbox_%&Index%选中\n%&InstPath%
  54.         CALC &Index=%&Index% + 1
  55.     }
  56. _END

  57. CALL @MainWindow
复制代码



代码运行后,swin不能实现滚动效果,参考官方实例搞不定,官方实例中主要起作用是这一句:ENVI @@POS=%&SWIN1_Wid%::::%H

但我看这样改变的是画布大小?

求教,谢谢

点评

swin有层级、滚动条可以通过代码滚动到指定位置。 这两个在 示例代码 文件夹里都有示例代码  详情 回复 发表于 2025-12-6 20:09
回复

使用道具 举报

19508#
发表于 2025-12-6 20:09:37 来自手机 | 只看该作者
dhwc 发表于 2025-12-6 19:44
写了个软件安装管理器,根据列表文件list.ini文件里的内容自动创建复选框,软件数量不固定,预设的swin太大 ...

swin有层级、滚动条可以通过代码滚动到指定位置。  这两个在 示例代码  文件夹里都有示例代码
回复

使用道具 举报

19509#
发表于 2025-12-6 20:52:11 | 只看该作者
红毛樱木 发表于 2025-12-6 20:09
swin有层级、滚动条可以通过代码滚动到指定位置。  这两个在 示例代码  文件夹里都有示例代码

我看的示例代码,那个功能过于完善了我这个场景觉得不太需要,核心语句不就是ENVI @@POS=%&SWIN1_Wid%::::%H%嘛?为啥写了没用呢
回复

使用道具 举报

19510#
发表于 2025-12-10 20:12:21 来自手机 | 只看该作者
dhwc 发表于 2025-12-6 20:52
我看的示例代码,那个功能过于完善了我这个场景觉得不太需要,核心语句不就是ENVI @@POS=%&SWIN1_Wid%::: ...

这个问题搞定了,调整的时机不对,方法也不对,最后在主窗体中加了个time控件解决了,也不知道是不是邪门歪道。

现在有新的问题:

1、怎样实现主窗体透明,swim不透明?

2、主窗体添加了全选/全不选按钮,好像不能穿透到swim去操作复选框?

3、添加了全选/全不选按钮,程序运行后,安装按钮文字不可见,随便点下某个复选框才会显示出来?

点评

上代码。瞎猜么。。。。  详情 回复 发表于 2025-12-10 21:17
回复

使用道具 举报

19511#
发表于 2025-12-10 21:17:59 | 只看该作者
dhwc 发表于 2025-12-10 20:12
这个问题搞定了,调整的时机不对,方法也不对,最后在主窗体中加了个time控件解决了,也不知道是不是邪门 ...

上代码。瞎猜么。。。。
回复

使用道具 举报

19512#
发表于 2025-12-10 21:39:21 | 只看该作者

  1. //_SUB MainWindow,W300H360,软件列表选择,,%windir%\system32\shell32.dll#130,15,,-top -disminb
  2. SET &SB_VERT=1
  3. SET &SIF_RANGE=0x0001

  4. ENVI &TotalCount=0
  5. ENVI &AllList=
  6. ENVI &Checkbox_All=0

  7. _SUB MainWindow,W300H360,软件列表选择,,%windir%\system32\shell32.dll#316,15,,-top -disminb
  8.     SWIN SWIN1:Page11:-SWINMAIN,L10T33W273H240,,0x140
  9.     ENVI @SWINMAIN:SWIN1.ID=?&Swin1_Wid   //画框ID
  10.     ENVI @SWINMAIN.ID=?&SWINMAIN_Wid    //与Page11窗口ID相同%&Page1_WID%
  11. ENVI @SWINMAIN.bkcolor=#FFFFFF
  12.     LABE -trans TitleLabel,L10T10W200H20,请选择要安装的软件:
  13.     ITEM OKButton,L200T285W84H30,开始安装,CALL OnOK
  14.     TIME Timer1,300,call SetSwin
  15.     CHEK Checkbox_All,L11T290W250H20,全选/全不选,call CheckboxAllChanged,1
  16. _END


  17. _SUB Page11,W600H240,,,,:0xFFFFFF
  18. //ENVI @this.bkcolor=0x000000
  19.     ENVI &YPos=10
  20.     ENVI &Index=0
  21.     ENVI &inList=0
  22.     SET$ NL=0D 0A

  23.     READ list.ini,*,&&AllContent

  24.     FORX *NL &AllContent,&&line,
  25.     {
  26.         mstr * &line1=1,1,&line
  27.         find $%&line1%=[,
  28.         {
  29.             find $%&line%=[softlist], ENVI &inList=1!ENVI &inList=0
  30.         }!
  31.         {
  32.             IFEX $%&inList%=1,
  33.             {
  34.                 FIND $%&line%=, exit -
  35.                
  36.                 // 解析软件名称、路径、默认是否选中
  37.                 MSTR * -delims:| SoftName,SoftPath,SoftStatus=<1><2><3>&line
  38.                  
  39.                 CHEK Checkbox_%&Index%,L40T%&YPos%W180H20,%SoftName%
  40.                 IFEX $%SoftStatus%=0,ENVI @Checkbox_%&Index%.Check=1
  41.                 IFEX $%SoftStatus%=2,team ENVI @Checkbox_%&Index%.Check=1|ENVI @Checkbox_%&Index%.Enable=0
  42.                
  43.                 ENVI &Checkbox_Name=Checkbox_%&Index%
  44.                 ENVI &Checkbox_Name_Path=%SoftPath%
  45.                 ENVI Checkbox_Name_Status=%SoftStatus%

  46.                 CALC &YPos=%&YPos% + 25
  47.                 CALC &Index=%&Index% + 1
  48.                
  49.                 ENVI &AllList=%Checkbox_Name_Path%%NL%%&AllList%
  50.             }

  51.         }
  52.     }
  53.     ENVI &TotalCount=%&Index%

  54.     //Find $%Checkbox_All.Check%=1,mess 全选!mess 全不选
  55.    
  56. _END

  57. _SUB SetSwin *
  58.     ENVI @Timer1.*del=
  59.     CALC #Hv=%&TotalCount%*26
  60.     ENVI @@POS=%&SWINMAIN_Wid%::::%Hv%
  61.     @TEAM SET-int inf=%&SIF_RANGE%:4| SET-int inf=%Hv%:12
  62.     CALL $--qd user32.dll,SetScrollInfo,#%SWIN1_Wid%,#%SB_VERT%,*&inf
  63. _END


  64. _SUB CheckboxAllChanged
  65.     ENVI &i=0
  66.     Find $ENVI @%&Swin1_Wid%:Checkbox_%&i%.Check=1,
  67.     {
  68.      MESS %Checkbox_All.Check%:::%&TotalCount%
  69.         LOOP #%&i% < %&TotalCount%,
  70.         {
  71.              ENVI @Checkbox_%&i%.Check=1
  72.              CALC &i=%&i% + 1
  73.         }
  74.     EXIT _Sub
  75.     }
  76.     Find $ENVI @%&Swin1_Wid%:Checkbox_%&i%.Check=0,
  77.     {
  78.         LOOP #%&i% < %&TotalCount%,
  79.         {
  80.              ENVI @Checkbox_%&i%.Check=0
  81.              CALC &i=%&i% + 1
  82.         }
  83.      }
  84. _END

  85. _SUB OnOK
  86. ENVI &InstPath=
  87. ENVI &Index=0

  88.     LOOP #%&Index% <= %&TotalCount%,
  89.     {
  90.         READ  -*,%&Index%,&InstPath,&AllList
  91.         Find $%Checkbox_%&Index%.Check%=1,TEAM mess Checkbox_%&Index%选中\n%&InstPath%
  92.         CALC &Index=%&Index% + 1
  93.     }

  94. _END


  95. CALL @MainWindow
复制代码

点评

看下了“画布”的原理,是GDI+绘制的,不是单独的传统窗口空间类型,自动继承透明通道等信息。 这个貌似PECMD 弄不了,因为默认就继承了。 另外两个问题,代码里没重现 不知道。  详情 回复 发表于 2025-12-11 14:29
回复

使用道具 举报

19513#
发表于 2025-12-11 14:29:33 | 只看该作者

看下了“画布”的原理,是GDI+绘制的,不是单独的传统窗口空间类型,自动继承透明通道等信息。   这个貌似PECMD 弄不了,因为默认就继承了。     另外两个问题,代码里没重现 不知道。
回复

使用道具 举报

19514#
发表于 2025-12-11 15:02:43 | 只看该作者
本帖最后由 dhwc 于 2025-12-11 15:04 编辑
红毛樱木 发表于 2025-12-11 14:29
看下了“画布”的原理,是GDI+绘制的,不是单独的传统窗口空间类型,自动继承透明通道等信息。   这个貌 ...

全选问题搞定了,还是用定时器控件。不能透明就算了。那个显示发虚的问题怎么解决?如图:



看右下角按钮



点评

swin高度太高覆盖了吧  详情 回复 发表于 2025-12-11 17:07
全选太长了,搞短一点  详情 回复 发表于 2025-12-11 15:12
回复

使用道具 举报

19515#
发表于 2025-12-11 15:12:13 | 只看该作者
dhwc 发表于 2025-12-11 15:02
全选问题搞定了,还是用定时器控件。不能透明就算了。那个显示发虚的问题怎么解决?如图:

全选太长了,搞短一点
回复

使用道具 举报

19516#
发表于 2025-12-11 15:19:06 | 只看该作者
489432757 发表于 2025-12-11 15:12
全选太长了,搞短一点

靠,特妈的,在swin里随便复制的,还以为是显示问题,要刷新啥的呢,谢谢
回复

使用道具 举报

19517#
发表于 2025-12-11 17:07:02 来自手机 | 只看该作者
dhwc 发表于 2025-12-11 15:02
全选问题搞定了,还是用定时器控件。不能透明就算了。那个显示发虚的问题怎么解决?如图:



swin高度太高覆盖了吧
回复

使用道具 举报

19518#
发表于 2025-12-11 17:13:18 | 只看该作者
红毛樱木 发表于 2025-12-11 17:07
swin高度太高覆盖了吧

解决了,是全选那个复选框太长覆盖了
回复

使用道具 举报

19519#
发表于 2025-12-19 21:14:35 | 只看该作者
学习学习
回复

使用道具 举报

19520#
发表于 5 天前 | 只看该作者
pecmd.exe放到什么位置
回复

使用道具 举报

19521#
发表于 4 天前 来自手机 | 只看该作者
本帖最后由 dhwc 于 2025-12-24 20:16 编辑

如果主窗体已经创建,怎样实时控制主窗体的透明度?     
CALL Main

_SUB Mainwindow,W300H360,窗口,,,15,,-top -disminb
ITEM OKButton,L200T285W84H30,调整透明度,CALL set
_END  

???

pecmd帮助里有ENVI @Mainwindow.trans=0x1,但是这个好像不能起作用,也不能指定具体的透明值

点评

用API试试:SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA);  详情 回复 发表于 前天 18:48
回复

使用道具 举报

19522#
发表于 前天 18:48 | 只看该作者
dhwc 发表于 2025-12-24 15:38
如果主窗体已经创建,怎样实时控制主窗体的透明度?     
CALL Main

用API试试:SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA);
回复

使用道具 举报

19523#
发表于 前天 19:34 | 只看该作者
527104427 发表于 2025-12-26 18:48
用API试试:SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA);

谢谢,我试试
回复

使用道具 举报

19524#
发表于 13 小时前 | 只看该作者
本帖最后由 红毛樱木 于 2025-12-28 05:03 编辑
Zap 发表于 2025-11-6 00:40
是哦 以C:\Windows\explorer.exe为例 第一个是名称ICO_MYCOMPUTER 应该转换为字符
  1. //LOGS * %&CurDir%\log.log
  2. ENVI^ ENVIMODE=1
  3. SET$ NL=0d 0a
  4. // PECMD2012 内部本身就是宽字符Unicode。路径\\可以直接写真实路径\,自动转义。
  5. //ENVI &exePath=%&CurDir%\Photoshop.exe
  6. //ENVI &exePath=%&CurDir%\sti_ci.dll
  7. ENVI &exePath=%&SystemROOT%\explorer.exe
  8. //ENVI &exePath=%&CurDir%\explorerx64.exe
  9. //ENVI &exePath=%&CurDir%\explorerx86.exe
  10. //ENVI &exePath=%&CurDir%\explorer.exe
  11. CALL GetFirstIconGroupID "%&exePath%" &iconId
  12. MESS. 是否获取成功(0为失败,1为成功):%&error%%&NL%%&NL%第一个图标ID: %&iconId%@

  13. _SUB GetFirstIconGroupID
  14.     EXIT= 0
  15.     ENVI-ret %~2=0
  16.     ENVI &&exePath=%~1
  17.     ENVI &&GENERIC_READ=0x80000000
  18.     ENVI &&FILE_SHARE_READ=0x00000001
  19.     ENVI &&OPEN_EXISTING=3
  20.     ENVI &&INVALID_HANDLE_VALUE=-1
  21.     CALL$--qd --ret:&&hFile Kernel32.dll,CreateFileW,$%&exePath%,#%&GENERIC_READ%,#%&FILE_SHARE_READ%,#0,#%&OPEN_EXISTING%,#0,#0       // C中的NULL就是0,在PECMD中用数值 #0
  22.     IFEX #%&hFile%=%&INVALID_HANDLE_VALUE%,
  23.     {*
  24.         ENVI-ret %~2=0
  25.         EXIT _SUB
  26.     }
  27.     CALL$--qd --ret:&&fileSize Kernel32.dll,GetFileSize,#%&hFile%,#0
  28.     ENVI &&PAGE_READONLY=0x02
  29.     CALL$--qd --ret:&&hMap Kernel32.dll,CreateFileMappingW,#%&hFile%,#0,#%&PAGE_READONLY%,#0,#%&fileSize%,0     //CreateFileMapping 要用实际的 CreateFileMappingW
  30.     ENVI &&FILE_MAP_READ=0x0004
  31.     CALL$--qd --16 --ret:&&pBase Kernel32.dll,MapViewOfFile,#%&hMap%,#%&FILE_MAP_READ%,#0,#0,#0
  32.     //MESS. %&pBase%@&pBase
  33.     IFEX #%&pBase%=0,
  34.     {*
  35.         CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hMap%
  36.         CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hFile%
  37.         ENVI-ret %~2=0
  38.         EXIT _SUB
  39.     }
  40.     // PIMAGE_DOS_HEADER 的结构体 IMAGE_DOS_HEADER  64字节
  41.     //SET$# &dos=*64 0
  42.     SET-mkfixdummy &dos=%&pBase%@0;*64
  43.     SET?longs dos=&&dos.e_lfanew:60
  44.     //MESS. %&dos.e_lfanew%@&dos.e_lfanew
  45.     // PIMAGE_NT_HEADERS 的结构体(64位为 IMAGE_NT_HEADERS64 大小 264字节)(32位为 IMAGE_NT_HEADERS32 大小 248字节)
  46.     IFEX #0,    //判断错误,应该直接判断PE文件头是32位还是64位。
  47.     {*
  48.     IFEX #%&bX64%=3,
  49.     {*
  50.         //SET$# &nt=*264 0
  51.         SET-mkfixdummy &nt=(%&pBase%+%&dos.e_lfanew%)@0;*264
  52.     }!  
  53.     {*
  54.         //SET$# &nt=*248 0
  55.         SET-mkfixdummy &nt=(%&pBase%+%&dos.e_lfanew%)@0;*248
  56.     }
  57.     }
  58.     ENVI &&IMAGE_NT_OPTIONAL_HDR32_MAGIC=0x10b      //32位
  59.     ENVI &&IMAGE_NT_OPTIONAL_HDR64_MAGIC=0x20b      //64位
  60.     SET?short (%&pBase%+%&dos.e_lfanew%)=&&nt.OptionalHeader.Magic:24
  61.     //MESS. %&nt.OptionalHeader.Magic%@&nt.OptionalHeader.Magic
  62.     IFEX #%&nt.OptionalHeader.Magic%=%&IMAGE_NT_OPTIONAL_HDR32_MAGIC%,
  63.     {*
  64.         SET-mkfixdummy &nt=(%&pBase%+%&dos.e_lfanew%)@0;*248
  65.     }!  
  66.     {*
  67.         IFEX #%&nt.OptionalHeader.Magic%=%&IMAGE_NT_OPTIONAL_HDR64_MAGIC%,
  68.         {*
  69.             SET-mkfixdummy &nt=(%&pBase%+%&dos.e_lfanew%)@0;*264
  70.         }!  
  71.         {*
  72.             CALL$--qd --bool --ret:&&UnmapViewOfFileRet Kernel32.dll,UnmapViewOfFile,#%&pBase%;
  73.             CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hMap%
  74.             CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hFile%
  75.             ENVI-ret %~2=0
  76.             EXIT _SUB
  77.         }
  78.     }
  79.     //GETF &nt,0#*,&&nt_Hex
  80.     //MESS. %&nt_Hex%@&nt_Hex
  81.     SET?long nt=&&nt.Signature:0
  82.     //MESS. %&nt.Signature%@&nt.Signature
  83.     ENVI &&IMAGE_NT_SIGNATURE=0x00004550  // PE00
  84.     IFEX #%&nt.Signature%<>%&IMAGE_NT_SIGNATURE%,
  85.     {*
  86.         CALL$--qd --bool --ret:&&UnmapViewOfFileRet Kernel32.dll,UnmapViewOfFile,#%&pBase%;
  87.         CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hMap%
  88.         CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hFile%
  89.         ENVI-ret %~2=0
  90.         EXIT _SUB
  91.     }
  92.    
  93.     // 定位资源目录
  94.     // auto& resDir = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
  95.     ENVI &&IMAGE_DIRECTORY_ENTRY_RESOURCE=2   // Resource Directory
  96.     //ENVI &&IMAGE_DIRECTORY_ENTRY_RESOURCE=0     // 测试
  97.     IFEX #0,
  98.     {*
  99.     IFEX #%&bX64%=3,
  100.     {*
  101.         SET-mkfixdummy &resDir=&nt@(4+20+112+(8*%&IMAGE_DIRECTORY_ENTRY_RESOURCE%));*8
  102.     }!  
  103.     {*
  104.         SET-mkfixdummy &resDir=&nt@(4+20+96+(8*%&IMAGE_DIRECTORY_ENTRY_RESOURCE%));*8
  105.     }
  106.     }
  107.     IFEX #%&nt.OptionalHeader.Magic%=%&IMAGE_NT_OPTIONAL_HDR32_MAGIC%,
  108.     {*
  109.         SET-mkfixdummy &resDir=&nt@(4+20+96+(8*%&IMAGE_DIRECTORY_ENTRY_RESOURCE%));*8
  110.     }!  
  111.     {*
  112.         IFEX #%&nt.OptionalHeader.Magic%=%&IMAGE_NT_OPTIONAL_HDR64_MAGIC%,
  113.         {*
  114.             SET-mkfixdummy &resDir=&nt@(4+20+112+(8*%&IMAGE_DIRECTORY_ENTRY_RESOURCE%));*8
  115.         }!  
  116.         {*
  117.             CALL$--qd --bool --ret:&&UnmapViewOfFileRet Kernel32.dll,UnmapViewOfFile,#%&pBase%;
  118.             CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hMap%
  119.             CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hFile%
  120.             ENVI-ret %~2=0
  121.             EXIT _SUB
  122.         }
  123.     }
  124.     //GETF &resDir,0#*,&&resDir_Hex
  125.     //MESS. %&resDir_Hex%@&resDir_Hex
  126.     SET?long resDir=&&resDir.VirtualAddress:0
  127.     //MESS. %&resDir.VirtualAddress%@&resDir.VirtualAddress
  128.    
  129.     // 定位资源节(.rsrc)
  130.     ENVI &&i=0
  131.     SET?shorts nt=&&nt.FileHeader.NumberOfSections:(4+2)    //WORD 2 字节,用short和wchar都可以
  132.     //MESS. %&nt.FileHeader.NumberOfSections%@&nt.FileHeader.NumberOfSections
  133.     SET?shorts nt=&&nt.FileHeader.SizeOfOptionalHeader:(4+2+2+4+4+4)
  134.     //MESS. %&nt.FileHeader.SizeOfOptionalHeader%@&nt.FileHeader.SizeOfOptionalHeader
  135.     //SET-mkfixdummy &section=&nt
  136.    
  137.     LOOP #%&i%<%&nt.FileHeader.NumberOfSections%,
  138.     {*
  139.         //#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) ((ULONG_PTR)(ntheader) + FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + ((ntheader))->FileHeader.SizeOfOptionalHeader ))
  140.         SET-mkfixdummy &section=(%&pBase%+%&dos.e_lfanew%+(4+20+%&nt.FileHeader.SizeOfOptionalHeader%))@(40*%&i%);*40        // 相当于 section++
  141.         //GETF &section,0#40,&&section_Hex
  142.         //MESS. %&section_Hex%@&section_Hex
  143.         SET?long section=&&section.VirtualAddress:12
  144.         //MESS. &section.VirtualAddress:%&section.VirtualAddress%@%&i%
  145.         SET?long section=&&section.Misc.VirtualSize:8
  146.         //MESS. IFEX #[ ( %&resDir.VirtualAddress% >= %&section.VirtualAddress% ) & ( %&resDir.VirtualAddress% < ( %&section.VirtualAddress% + %&section.Misc.VirtualSize% ) ) ],@%&i%
  147.         //IFEX #[ ( %&resDir.VirtualAddress% >= %&section.VirtualAddress% ) & ( %&resDir.VirtualAddress% < ( %&section.VirtualAddress% + %&section.Misc.VirtualSize% ) ) ],     // IFEX 存在BUG,不能这样嵌套使用,先算出来吧。
  148.         IFEX #%&resDir.VirtualAddress% >= %&section.VirtualAddress%,
  149.         {*
  150.             CALC &&Fix=%&section.VirtualAddress% + %&section.Misc.VirtualSize%
  151.             IFEX #%&resDir.VirtualAddress% < %&Fix%,
  152.             {*
  153.                 EXIT LOOP
  154.             }
  155.         }
  156.         CALC #&i=%&i% + 1
  157.     }
  158.     // 计算资源目录在文件中的实际偏移
  159.     SET?long section=&&section.PointerToRawData:20
  160.     CALC #&&resOffset=%&resDir.VirtualAddress% - %&section.VirtualAddress% + %&section.PointerToRawData%
  161.     //MESS. %&resOffset%<&i:%&i%><CALC #&&resOffset=%&resDir.VirtualAddress% - %&section.VirtualAddress% + %&section.PointerToRawData%>@&resOffset
  162.     SET-mkfixdummy &rootDir=(%&pBase%+%&resOffset%)@0;*16
  163.     SET?short rootDir=&&rootDir.NumberOfIdEntries:(4+4+2+2+2)
  164.     //MESS. %&rootDir.NumberOfIdEntries%@&rootDir.NumberOfIdEntries
  165.    
  166.     // 遍历资源类型,找到 RT_GROUP_ICON(ID=14)
  167.     //SET-mkfixdummy &typeEntry=(%&pBase%+%&resOffset%)@16;*8
  168.     //GETF &typeEntry,0#8,&&typeEntry_Hex
  169.     //MESS. %&typeEntry_Hex%@&typeEntry_Hex
  170.    
  171.     ENVI &&i=0
  172.     LOOP #%&i%<%&rootDir.NumberOfIdEntries%,
  173.     {*
  174.         SET-mkfixdummy &typeEntry=(%&pBase%+%&resOffset%)@(16+(8*%&i%));*8
  175.         SET?short typeEntry=&&typeEntry.Id:0
  176.         //MESS. %&typeEntry.Id%@%&i%
  177.         IFEX #%&typeEntry.Id%=14,       // RT_GROUP_ICON = 14
  178.         {*
  179.             // 获取第一个图标ID(进入ID目录的第一个条目)
  180.             SET?long typeEntry=&&typeEntry.OffsetToDirectory:4
  181.             CALC #&typeEntry.OffsetToDirectory=%&typeEntry.OffsetToDirectory% & 0x7FFFFFFF
  182.             SET-mkfixdummy &iconDir=(%&pBase%+%&resOffset%)@%&typeEntry.OffsetToDirectory%;*16
  183.             SET-mkfixdummy &iconIdEntry=(%&pBase%+%&resOffset%)@(%&typeEntry.OffsetToDirectory%+16);*8
  184.             SET?long iconIdEntry=&&iconIdEntry.DUMMYUNIONNAME.DUMMYSTRUCTNAME:0
  185.             //CALC &&NameIsString=shr(%&iconIdEntry?long%,31)     // 可以
  186.             CALC #&&iconIdEntry.DUMMYUNIONNAME.DUMMYSTRUCTNAME.NameIsString=shr(%&iconIdEntry.DUMMYUNIONNAME.DUMMYSTRUCTNAME%,31) & 0x1
  187.             //MESS. %&iconIdEntry.DUMMYUNIONNAME.DUMMYSTRUCTNAME.NameIsString%@
  188.             IFEX #%&iconIdEntry.DUMMYUNIONNAME.DUMMYSTRUCTNAME.NameIsString%=1,     //判断是否为字符串
  189.             {*
  190.                 //CALC -base=16 &&NameOffset=shl(%&iconIdEntry?long%,1)     // 不行
  191.                 //CALC -base=16 &&NameOffset=%&iconIdEntry?long% & 0x7FFFFFFF     // 可以
  192.                 CALC -base=16 &&NameOffset=%&iconIdEntry.DUMMYUNIONNAME.DUMMYSTRUCTNAME% & 0x7FFFFFFF       // 可以
  193.                 SET?short (%&pBase%+%&resOffset%+%&NameOffset%)=&&pIMAGE_RESOURCE_DIR_STRING_U.Length
  194.                 //SET-make &pIMAGE_RESOURCE_DIR_STRING_U.NameString=(%&pBase%+%&resOffset%+%&NameOffset%)@2;$%&pIMAGE_RESOURCE_DIR_STRING_U.Length%  或者下面的更直接
  195.                 SET-make &pIMAGE_RESOURCE_DIR_STRING_U.NameString=(%&pBase%+%&resOffset%+%&NameOffset%+2);$%&pIMAGE_RESOURCE_DIR_STRING_U.Length%
  196.                 ENVI-ret~ %~2=&pIMAGE_RESOURCE_DIR_STRING_U.NameString
  197.                 EXIT= 1
  198.             }!  
  199.             {*
  200.                 SET?short iconIdEntry=&&iconIdEntry.Id:0
  201.                 CALC &&firstIconId=%&iconIdEntry.Id%        // 不知道源码这里为什么用DWORD计算WORD
  202.                 ENVI-ret~ %~2=&firstIconId
  203.                 EXIT= 1
  204.             }
  205.             //MESS. %&firstIconId%@
  206.             
  207.             CALL$--qd --bool --ret:&&UnmapViewOfFileRet Kernel32.dll,UnmapViewOfFile,#%&pBase%;
  208.             CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hMap%
  209.             CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hFile%
  210.             //ENVI-ret~ %~2=&firstIconId
  211.             EXIT _SUB
  212.         }
  213.         CALC #&i=%&i% + 1
  214.     }
  215.     CALL$--qd --bool --ret:&&UnmapViewOfFileRet Kernel32.dll,UnmapViewOfFile,#%&pBase%;
  216.     CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hMap%
  217.     CALL$--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&hFile%
  218.     ENVI-ret %~2=0
  219. _END
复制代码


试试看。应该可以了。最近修行的快成仙了

回复

使用道具 举报

19525#
发表于 12 小时前 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-12-28 18:41

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表