无忧启动论坛

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

WIM文件也可有个性图标 (2008.2.24更新)

[复制链接]
91#
 楼主| 发表于 2008-2-7 22:51:01 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

92#
 楼主| 发表于 2008-2-8 15:49:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

93#
发表于 2008-2-8 17:38:24 | 只看该作者
这个可以减小WIM文件的大小,但好像不是很必要.

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

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

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

[ 本帖最后由 chenall 于 2008-2-8 05:39 PM 编辑 ]
回复

使用道具 举报

94#
 楼主| 发表于 2008-2-8 21:37:41 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

95#
 楼主| 发表于 2008-2-8 23:24:44 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

96#
发表于 2008-2-8 23:37:28 | 只看该作者
原帖由 nn2nn 于 2008-2-8 11:24 PM 发表
在DLL里面内置一个图标,没有图标时直接使用内置的图标,
这样好。


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

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

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

未命名.PNG
回复

使用道具 举报

97#
 楼主| 发表于 2008-2-9 10:55:31 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

98#
发表于 2008-2-9 10:58:26 | 只看该作者
看不懂的说啊,只能等成果,呵呵
回复

使用道具 举报

99#
 楼主| 发表于 2008-2-9 11:12:28 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

100#
发表于 2008-2-9 13:53:05 | 只看该作者
如果DLL做得好,写在XML应比写在WIM文件尾好。
赞成!!
发现WIM文件的XML在WIM文件的结尾......
确实如此,不知是否可行....

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

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

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

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

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

使用道具 举报

101#
发表于 2008-2-9 15:01:07 | 只看该作者
刚刚下载的新版的SETICO,支持写入INI格式的图标路径,

就顺手再修改了一下代码,让它也支持这个功能.

可以用SETICO的写入IE快捷方式图标功能对一个WIM文件写入图标路径.

测试OK,用INI格式的很简单(比从注册表读取还简单).

另SETICO,会重复写入,有没有办法改一下?

现在的这个DLL可以适用于任何类型的文件了,只要把 IE快捷方式图标的INI写于该文件后面.
注册表也加一下就可以了.

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

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

wimico1.PNG (22.56 KB, 下载次数: 109)

INI的效果图

INI的效果图
回复

使用道具 举报

102#
 楼主| 发表于 2008-2-9 15:43:33 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

103#
 楼主| 发表于 2008-2-9 15:47:42 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

104#
发表于 2008-2-9 15:49:41 | 只看该作者

回复 #102 nn2nn 的帖子

就是用你的SETICO写入WIM的啊,
只是这个功能有个缺点就是WIM文件比较大的时候会有延迟.

看上图,test.wim本来是空白的内容.用SETICO写入后的内容.
对其它WIM文件一样生效,Freeime.WIM也是只写入捷方式图标.1Freeime.WIM就是之前的方式.

抛砖引玉,希望高手改进.....
回复

使用道具 举报

105#
 楼主| 发表于 2008-2-9 15:50:33 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

106#
 楼主| 发表于 2008-2-9 15:58:49 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

107#
 楼主| 发表于 2008-2-9 16:29:18 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

108#
 楼主| 发表于 2008-2-9 17:13:29 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

109#
发表于 2008-2-9 17:58:54 | 只看该作者
已经可以支持如106图的结构了,我想得太多了晕.很简单的问题被我搞复杂了....
再上传一个,支持读取像106#图的结构的图标.

原WIM文件+ICO资源文件路径+\0+(4BYTE)索引+WIMICO结构


图标索引好像没有必要用到4BYTE吧.1个字节(255个)应该可以应付的了.

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

使用道具 举报

110#
 楼主| 发表于 2008-2-9 20:40:26 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

111#
 楼主| 发表于 2008-2-9 20:51:37 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

112#
 楼主| 发表于 2008-2-9 21:30:17 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

113#
发表于 2008-2-9 22:05:25 | 只看该作者
支持,DLL文件要处理的事情是越少越好(越简单越好)

4、为文件路径+索引形式,设置指针,完成。(索引为1字节,要转换一下)。
我不懂得转换,好像直接用ReadFile读就OK了.
::ReadFile(hFile,piIndex,1,&re,0);
当这个字节为01时读出来是-255,这是在*piIndex还没有赋值的情况下读到的数据.
也就是FFFFFF01
后记:(因为我前面设置了一个负的索引.)

但若是给它初使化一下再读出来就正常的.
*piIndex=0;
::ReadFile(hFile,piIndex,1,&re,0);
得到的piIndex是1.

我的理解为
初使化为0后就是00 00 00 00
::ReadFile只是将读到的数据直接替换内存中的相应字节的数据
固得到FF FF FF 01和00 00 00 01

刚试了一下确实如此,所以上面的上传代码会有问题.

[ 本帖最后由 chenall 于 2008-2-10 12:17 AM 编辑 ]
回复

使用道具 举报

114#
 楼主| 发表于 2008-2-10 09:37:37 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

115#
 楼主| 发表于 2008-2-10 09:53:56 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

116#
发表于 2008-2-10 10:41:44 | 只看该作者
晕.之前学的大部份给忘了.
我都不知如何补 \0了.

我暂时这样做,好像也行.
先初使化,然后再readfile,再传值.
TCHAR IconFile[MAX_PATH]=_T("\0");
::ReadFile(hFile,IconFile,wimico.Length-1,&re,0);
lstrcpyn (szIconFile,IconFile, cchMax );
回复

使用道具 举报

117#
 楼主| 发表于 2008-2-10 11:08:56 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

118#
发表于 2008-2-10 11:50:01 | 只看该作者
lstrcpyn会自动补\0
但是
TCHAR IconFile[MAX_PATH];
::ReadFile(hFile,IconFile,wimico.Length-1,&re,0);
读出来的数据没有\0.(用WINHEX中看到的是
读到的内容+(十六进制的CC CC CC ....)
若刚开始IconFile[MAX_PATH]="\0";则就是读到的内容+00 00 00 .....
所以我的解决有二种.
一.对IconFile初使化.就是上面的例子.
二.用lstrcpyn,只复制有用的字符.wimico.Length-1
wimico.Length-1就是读取字符长度,由于后面还会自动加一个'\0'所以再+1
lstrcpyn (szIconFile,IconFile,wimico.Length);
还是用第二种比较方便...

不知会不会有其它不良影响,,会VC++帮忙看下.
回复

使用道具 举报

119#
发表于 2008-2-10 12:17:51 | 只看该作者
CreateIconFromResourceEx 函数
  该函数通过描述图标的资源位创建图标或光标。
定义
  HICON CreateIconFromResourceEx(PBYTE pbIconBits, DWORD cbIconBits, BOOL fIcon, DWORD dwVersion, int cxDesired, int cyDesired, UINT uFlags);
参数
  pbIconBits
    指向包含图标或光标资源位缓冲区的指针。通常可通过调用 LookupIconIdFromDirectoryEx 或 LoadResource 函数载入这些位。
  cbIconBits
    以字节为单位指定由 pbIconBits 参数指定的位集合的大小。
  fIcon
    指定创建图标还是光标,如果参数为 TRUE ,创建图标;如果参数为 FALSE ,创建光标。
  dwVersion
    指定由 pbIconBits 参数指定的资源位的图标或光标格式的版本号。参数可以是下列的值: 0x00030000 。
  cxDesired
    指定图标或光标的期望宽度(以像素为单位)。如果参数是零,函数使用 SM_CXICON 或 SM_CXCURSOR 系统公制值设置宽度。
  cyDesired
    指定图标或光标的期望高度(以像素为单位)。如果参数是零,函数使用 SM_CYICON 或 SM_CYCURSOR 系统公制值设置高度。
  uFlags
    该参数为下列值的组合:
LR_DEFAULTCOLOR
使用缺省颜色格式。
LR_DEFAULTSIZE
如果 cxDesired 或 cyDesired 为 0 且设置了该标志,则使用系统宽度和高度,如果没有设置该标志,则使用资源的实际尺寸,如果资源包含多个图像,以第一个图像为准。
LR_MONOCHROME
创建单色图标或光标。
LR_SHARED
当图标或光标被多次创建时,共享这些图标或光标,如果没有指定该标志,下次使用同样的资源时会重新创建图标或光标,并返回不同的句柄。
当使用该标志时,系统会自动清除不再需要的资源。
对于非标准尺寸的图标或光标,请不要使用该标志。
载入系统图标或光标时,必须指定 LR_SHARED 标志。
返回值
  如果函数调用成功,返回值为图标或光标的句柄。如果函数调用失败,返回值为 NULL 。想获得更多的错误信息,请调用 GetLastError 函数。
说明
  CreateIconFromResource、CreateIconFromResourceEx、CreateIconIndirect、GetIconInfo 和 LookupIconIdFromDirectoryEx 函数允许外壳应用程序和图标浏览器在整个系统中检查和使用资源。

必须使用 DestroyIcon 函数删除 CreateIconFromResourceEx 函数创建的光标。
回复

使用道具 举报

120#
发表于 2008-2-10 13:37:40 | 只看该作者
原帖由 chenall 于 2008-2-10 11:50 发表
lstrcpyn会自动补\0
但是
TCHAR IconFile[MAX_PATH];
::ReadFile(hFile,IconFile,wimico.Length-1,&re,0);
读出来的数据没有\0.(用WINHEX中看到的是
读到的内容+(十六进制的CC CC CC ....)
若刚开始IconF ...

C里字符串都是以0结尾,如果不以0结尾会把字符串后的内存也读也来(显示为乱码)
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-28 12:53

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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