无忧启动论坛

标题: WIM文件也可有个性图标 (2008.2.24更新) [打印本页]

作者: nn2nn    时间: 2008-1-28 15:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-28 16:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-1-28 16:07
等会VC的朋友出手完善优化.....

目前的DLL文件源码,
支持显示 SETICO(02.08)写入的图标和路径图标
还有默认图标(从注册表中读取的),无图标时就显示默认图标.
文件大小小于WMICO结构的就显示WIMHEX图标.

修改自56#

0211
支持新版SETICO写入的RES图标.
不支持之前的图标格式


另外弄了一个设置工具,可以对任意类型(任意扩展名)的文件添加图标扩展支持.
供测试.

通用文件图标扩展设置内含DLL文件,可以为任意扩展名的文件添加图标扩展功能(可以配合SETICO写入图标).
无图标时显示默认图标(对应文件类型原来的图标)

0213
重新生成的工程,改了文件名和CLSID

0214
1.修改了一下,添加了之前的写入IE快捷方式图标的支持.(只指对文本文件扩展名为".TXT,.INI,.CMD,.BAT,.INF,.TXT,.LOG")
2.添读取注册表默认图标改到一个模块中,需要使用时才调用(之前每次都先读取).

0214:晚又改了一下,IE快捷方式图标的支持.(只指对非WIM文件).

[ 本帖最后由 chenall 于 2008-2-23 03:59 PM 编辑 ]

未命名.PNG (38.51 KB, 下载次数: 351)

未命名.PNG

wimFileIcons3.rar

55.18 KB, 下载次数: 455, 下载积分: 无忧币 -2

IconShEx.rar

23.65 KB, 下载次数: 316, 下载积分: 无忧币 -2

02-13重新生成

图标扩展设置工具.rar

10.18 KB, 下载次数: 388, 下载积分: 无忧币 -2

扩展设置批处理版本

IconShEx0214.rar

23.92 KB, 下载次数: 363, 下载积分: 无忧币 -2

注册个性图标.rar

16.75 KB, 下载次数: 353, 下载积分: 无忧币 -2

图标扩展设置工具WIM版本

IconShEx.rar

8.26 KB, 下载次数: 344, 下载积分: 无忧币 -2

不带默认(WINHEX)图标的版本


作者: chenall    时间: 2008-1-28 17:52
根据一楼的注册表修改后的效果图.

wim.JPG (18.99 KB, 下载次数: 222)

wim.JPG

作者: nn2nn    时间: 2008-1-28 19:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 沙漠之子    时间: 2008-1-28 21:12
似乎MSC文件就是xml格式的文件

文件图标是以BASE64编码方式存储的说
作者: nn2nn    时间: 2008-1-28 22:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: lisong    时间: 2008-1-28 22:15
等待高手解决!!!!!!!!
作者: nn2nn    时间: 2008-1-28 22:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-1-28 22:54
原帖由 nn2nn 于 2008-1-28 10:07 PM 发表
用DELPHI做,大约500K ,很大呀。

相对于PE,大了点。

你已经用DELPHI做好了DLL文件了吗?

我下载了顶楼衔接的例子看了下,它那个DLL文件36KB.(VC6的)
作者: nn2nn    时间: 2008-1-29 09:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-29 09:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-1-29 12:34
我也觉得第二种方案会比较好,

如果采用类似MMC那样的将图标文件编码成BASE64文本文件后,体积会增大很多吗?要不然用这样感觉比较好.
不但可以给二进制文件提供个性图标,文本文件也可以.

可以将图标文件编码成文本后放在WIM文件的最后面(不用写到WIM文件里面).

[ 本帖最后由 chenall 于 2008-1-29 12:38 PM 编辑 ]

ShellExtGuide9_demo.zip

14.36 KB, 下载次数: 110, 下载积分: 无忧币 -2


作者: nn2nn    时间: 2008-1-29 13:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-29 13:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-1-29 17:21
怎么没有人关注啊,我再顶一下..
作者: lxl1638    时间: 2008-1-29 18:00
换个图标而已,没有多大的实际意义。
作者: nn2nn    时间: 2008-1-29 18:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: 123    时间: 2008-1-29 18:31
从哪读取图标?不会解压WIM中的一个图标文件。
作者: nn2nn    时间: 2008-1-29 18:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: lxl1638    时间: 2008-1-29 18:45
不如直接读取DLL中的图标,这样只需一套图标就可以了。
如果图标放到WIM中,每一个WIM都附一套图标不无值得。
作者: nn2nn    时间: 2008-1-29 18:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-29 18:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: lxl1638    时间: 2008-1-29 19:13
图标做入XML中可能兼容性好些,即使修改WIM以后也不影响WIM的图标和WIM的使用。
作者: 123    时间: 2008-1-29 19:54
原帖由 nn2nn 于 2008-1-29 18:40 发表
#15.

从WIM文件的尾部。

这么说还得用专用程序写入?
作者: nn2nn    时间: 2008-1-30 09:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-30 09:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-30 11:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-1-30 11:58
不懂,纯支持,再顶下..希望早日有成品
作者: 123    时间: 2008-1-30 12:03
原帖由 nn2nn 于 2008-1-30 11:12 发表
*phiconLarge = (HICON) LoadImage ( _Module.GetResourceInstance(),
                                       MAKEINTRESOURCE(uIconID), IMAGE_ICON,
                                       32, 32, LR ...

exe,dll里的资源最容易得到HICON,不过最好还是把ICO文件加载到内存再转换成HICON
找到一个,不过要解压到临时文件夹。
m_hIcon = (HICON)LoadImage( NULL, "f:\\pictures\\8339.ico",
     IMAGE_ICON, 0, 0, LR_LOADFROMFILE );

[ 本帖最后由 123 于 2008-1-30 12:04 PM 编辑 ]
作者: nn2nn    时间: 2008-1-30 13:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-30 13:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: 123    时间: 2008-1-30 15:43
从WIM后面读取图标可以用,但注册表不会弄,老是TXT文件在用这个DLL。

TxtFileIcons.rar

13.77 KB, 下载次数: 163, 下载积分: 无忧币 -2


作者: lxl1638    时间: 2008-1-30 15:59
之前你使用了别人的工具,注册了相同的CLSID {DF4F5AE4-E795-4C12-BC26-7726C27F71AE}
系统中注册CLSID要小心,不能与别人使用的相同,要用CoCreateGuid创建。

[ 本帖最后由 lxl1638 于 2008-1-30 04:01 PM 编辑 ]
作者: 123    时间: 2008-1-30 16:18
原帖由 lxl1638 于 2008-1-30 15:59 发表
之前你使用了别人的工具,注册了相同的CLSID {DF4F5AE4-E795-4C12-BC26-7726C27F71AE}
系统中注册CLSID要小心,不能与别人使用的相同,要用CoCreateGuid创建。

没有CoCreateGuid

1.JPG (8.4 KB, 下载次数: 132)

1.JPG

作者: lxl1638    时间: 2008-1-30 17:00
是微软的API,网上找找看看是哪个一DLL的,动态加载,用完就丢(卸)
作者: nn2nn    时间: 2008-1-30 18:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: lxl1638    时间: 2008-1-30 18:45
原来的shellreset可以用,但CLSID一定要用CoCreateGuid创建,否则到一些机子上会与别人已经注册的CLSID重复。
一般Wimdows外壳扩展的DLL、很多杀软都有自己的CLSID,弄不好会重复。
作者: nn2nn    时间: 2008-1-30 19:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-30 19:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-30 20:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-30 20:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-30 20:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: 123    时间: 2008-1-30 20:43
原帖由 nn2nn 于 2008-1-30 20:07 发表
typedef struct _WIMICO
{
        ULARGE_INTEGER OffsetToEnd;
        DWORD Length;
        DWORD Check;
}WIMICO,*PWIMICO;
#define ...

那是ico文件的长度
作者: nn2nn    时间: 2008-1-30 20:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-30 20:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-31 10:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: 123    时间: 2008-1-31 11:55
原帖由 nn2nn 于 2008-1-30 20:50 发表
DWORD  Length;是ico文件的长度.

向前偏移 Length就是ico文件的开始地址(即文件长度-WIMICO长度-Length=ULARGE_INTEGER OffsetToEnd;)

ico文件未必一定在文件结尾,而且主要是为了以后扩展。
不过好像没有人会在WIM文件结尾加入大于4GB的东西,可以把ULARGE_INTEGER改成DWORD节省4字节。

[ 本帖最后由 123 于 2008-1-31 11:58 AM 编辑 ]
作者: 玄天    时间: 2008-1-31 12:12
没必要搞的如此麻烦吧,直接用 Axialis IconWorkshop 建立个图标库然后导出为dll文件就行了嘛
作者: nn2nn    时间: 2008-1-31 12:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-31 12:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: 123    时间: 2008-1-31 13:22
原帖由 nn2nn 于 2008-1-31 12:36 发表

ico文件必需在文件结尾,否则,没办法找到WIMICO结构。
(可以在WIM头定位WIMICO结构的位置,但这个位置未找到,即使找到MS没用(备用)的空间,那就是对WIM的兼容性的挑战了。查找标记定位也不好,那要花时。)

我的意思是在文件尾加了ICO后还可以加其它东西,这样ICO就不是刚好在文件尾。像我以前搞的一个程序,在EXE文件尾加了另一个EXE,然后在这个EXE尾部还加了IP,密码等信息。
作者: nn2nn    时间: 2008-1-31 16:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-31 16:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-31 16:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: 123    时间: 2008-1-31 16:34
原帖由 nn2nn 于 2008-1-31 16:13 发表
做好了DLL吗?(我还没装VC,不能编译)

放出来试试!

注册问题是小事,可手工注册。

TxtFileIcons.rar (11.98 KB, 下载次数: 151)
原帖由 nn2nn 于 2008-1-31 16:21 发表
DWORD OffsetToEnd;
从字面上看,是文件尾的偏移。
读完了WIMICO,文件指针是文件尾还是WIMICO的头?

应该是WIMICO后面,每次读前都设置一下就行了。
作者: nn2nn    时间: 2008-1-31 19:38
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-31 19:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-1-31 21:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: 123    时间: 2008-1-31 21:56
原帖由 nn2nn 于 2008-1-31 21:53 发表
TO123:
我刚装了创天中文VC++,(很老的)。
为什么编译你发的源码不通过?
以下提示:是什么意思?
--------------------Configuration: TxtFileIcons - Win32 Unicode Release MinDependency----------- ...

把出错的地方删掉,可能我没注意
作者: nn2nn    时间: 2008-1-31 23:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-2-1 14:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-2-1 15:12
初步测试了下,极不稳定,时不时出现错误.文件浏览器还经常会崩溃只要打开那个目录浏览器就重新启动.
又在PE试了竟然没有出错,也不会崩溃.

我的系统是2003的,还有需要再改一下如果文件没有图标就返回默认图标.要不然没有图标的太难看了.

[ 本帖最后由 chenall 于 2008-2-1 03:30 PM 编辑 ]
作者: nn2nn    时间: 2008-2-1 16:18
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-2-1 16:31
继续努力,希望早日用上,现在可以看到个性图标了,但是经常会崩溃....

我只有测试的份了,编程的帮不上什么忙.
作者: lxl1638    时间: 2008-2-1 16:39
原帖由 nn2nn 于 2008-2-1 02:49 PM 发表
做了个DELPHI版本,500K,不出所料,VC版本50K。

(另设置个性图标工具,在前几页。)

(欠自信的人不要试)

希望可以快点出VC版本。

如果用VC,就算和WimShExt.DLL合并,16K左右即可搞定。
作者: nn2nn    时间: 2008-2-1 17:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-2-1 17:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: stwcb2007    时间: 2008-2-1 19:34
最近经常关注这个帖子
我水平不够帮不上什么忙
那就说说想法吧

我觉得做一个WimIco.dll虽然也不错
但不同的程序需要不同的图标
做成WimIco.dll就减少了扩展的能力
不方便大家YY了

我的思路是将WIM文件注册成和EXE同类型的文件
那么系统在浏览WIM文件时就会自动读取WIM中的图标(类似于读取EXE中的图标)
我们只需要在制作WIM文件时将指定的ICO放到WIM里面就可以了

我对EXE和WIM的文件格式了解不够
不知道可不可以

[ 本帖最后由 stwcb2007 于 2008-2-1 07:35 PM 编辑 ]
作者: armymangl    时间: 2008-2-1 19:46
真是肯钻啊,服了楼主了,等搞出来了俺捡现成的
作者: nn2nn    时间: 2008-2-1 20:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-2-2 17:41
沉得这么快,才一天不见就差点找不到了.
再顶一下,如果这个dll稳定了以后就可以为其它文件提供个性图标了,

只要添加注册表.
作者: nn2nn    时间: 2008-2-2 21:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-2-3 10:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-2-3 10:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-2-5 17:58
提示: 作者被禁止或删除 内容自动屏蔽
作者: 421062724    时间: 2008-2-5 19:26
能有图标是好多了,我就等成果了
作者: nn2nn    时间: 2008-2-6 21:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: 沙漠之子    时间: 2008-2-6 23:01
我的使用过程
1.源文件 选择一已存在的wim文件
2.导出文件 选一未存在的wim文件
3.图标资源 选了一ico文件
4.点击获取图标
5.写入ico文件
发现生成一个10kb左右的导出文件
5.点击写入wim文件
提示"恭喜发财 成功了!"
并没输出什么东东

如果源文件和导出文件相同,则该源文件变成10kb的wim文件
并且反复点击写入wim文件,导出文件会变大一次(即可能又写入一图标)

最后,将导出文件的后缀名改为exe 图标显示出来了

还有,在使用本工具可从导出文件中获取图标(即在图标预览框中显示出来),不过会提示
"Not a PE (WIN32 Executable) file."
使用其他资源工具或图标提取工具都不行(因为这不是32位可执行文件,不支持提取)

最最后,导出ICO文件功能使用不成功(包括:dll文件中的图标资源,及含图标的wim文件,和原始ico文件)

测试完毕

[ 本帖最后由 沙漠之子 于 2008-2-6 11:13 PM 编辑 ]
作者: chenall    时间: 2008-2-7 00:04
测试显示图标成功,
但是那个DLL文件太难用了,希望有人出手.
目前的DLL对中文文件名支持有点问题题,并且当同一个目录下同时存在两个WIM文件(都有设置了图标)就要死......
作者: nn2nn    时间: 2008-2-7 10:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-2-7 10:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-2-7 16:18
秀一下我的PETOOLS目录,

WIM文件已经设置了图标..

看起来好看多了,只是没有设置图标的文件的不会使用默认图标(我不知如何改).
使用的DLL文件是56楼123 (Forestfairy) 提供的代码编译的.稍微改了一下.

上传一个DLL附件,可以试下效果..

用的是ReleaseUMinSize的文件.28KB.

顺便再说一下,希望setico.exe下次可以支持拖放,要不然像现在这样要改几个文件很麻烦,最好是可以批操作.
比如.
某个目录下.
X1.WIM
X1.ICO
X2.WIM
X2.ICO
可以批量生成新的带ICO的WIM文件.

[ 本帖最后由 chenall 于 2008-2-10 11:46 PM 编辑 ]

WIMICO.PNG (39.11 KB, 下载次数: 161)

WIM文件设置图标效果

WIM文件设置图标效果

作者: nn2nn    时间: 2008-2-7 17:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-2-7 17:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-2-7 17:46
原帖由 nn2nn 于 2008-2-7 05:29 PM 发表
TxtFileIcons.dll
这个东西哪来的?


用56#楼的代码修改编译的啊.试了下挺好用的.呵呵.

现在的一个问题就是默认图标的显示.
作者: 沙漠之子    时间: 2008-2-7 19:25
使用regsvr32 注册了一下TxtFileIcons.dll 又刷了下图标缓存 看到图标了的说
作者: 沙漠之子    时间: 2008-2-7 19:37
原帖由 chenall 于 2008-2-7 05:46 PM 发表


用56#楼的代码修改编译的啊.试了下挺好用的.呵呵.

现在的一个问题就是默认图标的显示.

msc文件的默认图标是mmcshext.dll中的第一个图标

因此设想wim的默认图标可弄成TxtFileIcons.dll中的第一个图标
不过我手工嵌入图标到TxtFileIcons.dll 仍不能显示
故可能还需加入什么函数或其他东东到TxtFileIcons.dll中的说
作者: nn2nn    时间: 2008-2-7 22:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-2-7 22:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-2-7 22:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-2-8 15:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-2-8 17:38
这个可以减小WIM文件的大小,但好像不是很必要.

我刚试了从注册表读取默认图标,当WIM文件没有带图标时就使用注删表默认图标.
编译后文件竟增大一倍.

支持默认图标,不知合不合算.
若是在DLL里面内置一个图标,没有图标时直接使用内置的图标,就简单多了.

我不太懂VC,大部份的代码都是网上找的.

[ 本帖最后由 chenall 于 2008-2-8 05:39 PM 编辑 ]
作者: nn2nn    时间: 2008-2-8 21:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: nn2nn    时间: 2008-2-8 23:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: lxl1638    时间: 2008-2-8 23:37
原帖由 nn2nn 于 2008-2-8 11:24 PM 发表
在DLL里面内置一个图标,没有图标时直接使用内置的图标,
这样好。


也可以直接读取WIMNT.EXE中的图标。
本人今天刚好有空,也做了一个WIM个性化图标的DLL,17K左右,但很不满意,非常不稳定。
阿呆有经验,给些提示。

本人是将图标数据以BASE64编码保存在XML中的(BASE64编码只比实际数据的长度大1/3),解码速度非常快,不知是什么原因引起不稳定的。

未命名.PNG (11.03 KB, 下载次数: 161)

未命名.PNG

作者: nn2nn    时间: 2008-2-9 10:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 421062724    时间: 2008-2-9 10:58
看不懂的说啊,只能等成果,呵呵
作者: nn2nn    时间: 2008-2-9 11:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-2-9 13:53
如果DLL做得好,写在XML应比写在WIM文件尾好。
赞成!!
发现WIM文件的XML在WIM文件的结尾......
确实如此,不知是否可行....

我另有一个想法,不知用INI格式会不会简单点呢?

附,可以支持默认图标的DLL(带源码),从注册表中读取默认图标.
如果WIM文件没有设置图标就使用原来的图标来显示.
内置了一个WINHEX的图标(非默认图标,只用于测试)
测试方法,直接新建一个文件文件,然后扩展名为.WIM就会显示这个图标.

注:我不懂得弄,所以只能编译成非U的DLL

这个代码是修改自56# 123的附件.

[ 本帖最后由 chenall 于 2008-2-10 11:13 AM 编辑 ]




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3