急请教有过处理"把vb6程序界面变成xp风格"经验的大侠们一个问题:我在网上找到个.res文件,问一下如果只是加上这个文件,会不会在有的电脑上出错?

clintonus 2011-11-05 02:59:29
RT.
网上看到有很多种实现方法,我想知道到底哪个是最方便又稳定的.
1 网上有很多这个.res文件,只要在编译的时候 "ctrl d" 把那个res文件加到工程里就可以了,而且也不增加程序的大小,非常方便.
但是我发现有的.res文件加到工程里面编译后,整个程序根本就启动不起来了,直接报错而后退出,比如这里这个.res文件:http://demon.tw/operating-system/vb-xp-style.html . 我后来找到的一个能用的是在codefans上找到的.
这样就有一个问题,我相信网上贴出来的那些.res文件在他贴出的时候肯定是他自己已经测试过可以用的,这么说来是不是等于说这个.res文件有时效性问题?比如说系统版本高了以后这种.res文件就有可能失效? 如果是这样的话,那我程序里加.res肯定不合适,因为说不定哪天用户的系统就升级了,结果人家连软件都打不开了,那肯定不行.

2 第二种方法:这种方法很麻烦.用.res文件的方式我研究了下,其实好像就是源于这第二种方法,是对这个方法的改进:加用.manifest文件的方法(只不过.res方式再也不用多带着个文件了),而加用.manifest文件的方法我网上看到是有很多报错的,说是要加这个声明和代码:
Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
Private Sub Form_Initialize()
InitCommonControls
End Sub
这么说来,使用.res文件的方法,需不需要也加上这个声明和代码呢?是不是如果加上就一定保险稳定了?不管什么系统的不会报错自动退出?如果是的话,那在第一种方法里加上这个代码倒是也不麻烦,那就用第一种方法还是可以的.

3 第三种方式是用exescope软件,它直接有一个"使用xp样式"的功能,这种方法也很方便.但是其稳定性我在网上没有找到任何评论.不知道是不是任何系统(>xp)都不会出错?
但是就我自己测试的经验看,它至少有一个缺点,就是你的程序(本来不报毒的很正常的程序)在使用之后有的会被360报木马,不知道是怎么回事.我看到exescope好像是要把manifest文件注入到软件内,不知道是不是因为这个360报毒(但是我一些别的程序在"改xp样式"以后又不会被报毒)(我的exescope软件本身是多特上下载的,我到viruscan上查过是没毒的,360也没报毒)
如果是会报毒,那显然也不适合采用.做个软件给用户他那里报毒,这谁改用啊?

4 所以总的来说我是倾向于使用方法1,但是想请教下有经验的大侠们:
1>它到底稳定性怎么样?
2>要不要加上方法2中的那些代码?如果加上,会不会反而可能在有的电脑上会出错?

5 说明一下,我要的只是标准控件变成xp风格就可以了,那些比如说frame里面会变黑色之类的问题也都不论.我只是想知道下方法的稳定性怎么样.
急求!多谢!!
...全文
253 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
axjuan 2011-11-10
我想实现WIN7风格怎么办?求前辈指导。。。。
回复
波导终结者 2011-11-10
1.资源文件和.manifest是一样的。

2.VB6的程序用了这个以后,好几个常用控件的显示都会不正常。像黑底的情况,我记得我以前是再多盖一层picture解决好像。

3.RES文件没办法用是因为它的大小不是4字节的整数倍……大概是这样,我以前做毕业设计的时候也是用的这个方法实现XP风格,有一点印象。

4.建议用VC6编辑RES文件,顺便看看那些不能正常启动的RES文件和能正常启动的大小和内容有什么差别。正如上面所说,VB6只能保存为字符串的24而不是24这个数值。
回复
使用API的时候,有时候也可能会影响到XP样式的正常使用。
我记得用 VC 的 Win32 SDK 方式创建窗口时,有一次做了一个类,那个类只是做一些基本的系统
信息提取与设置的工作,其中有一项功能是取得当前程序的运行路径。我在做类的时候为了能支持
UNICODE环境的开发,所以在写函数的时候写了 GetExePathA 和 GetExePathW 两个函数,在类
初始化的时候我也同时使用了两个函数,大致是这样:

...
ExePathA = GetExePathA();
ExePathW = GetExePathW();
...

结果整个程序的窗口样式都没有了,后来发现,如果我在 ASCII 的环境下用 ExePathW = GetExePathW();
XP 样式就会消失,变成最原始的 Windows 样式。

其实导致 XP 样式失效的可能性还很多,无论那种方法,根据程序细节、系统版本、系统配置的不同都有可能出现不同的情况。而且 Microsoft 的系统兼容性本来就不是很好,即使出现问题也是可以理解的。
回复
clintonus 2011-11-10
我找到的那个能用的那个res文件大小显示是1k,内容用记事本打开是这样:(开头有几个乱码不知道是什么,它里面好像还要管理员账户requireAdministrator?我再到非管理员账户下试试)

  ?   0 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="IsUserAdmin" type="win32"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>  
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
</assembly>

回复
clintonus 2011-11-10
[Quote=引用 9 楼 axjuan 的回复:]
我想实现WIN7风格怎么办?求前辈指导。。。。
[/Quote]win7和xp是同一个res,它好像是反正调用你正在使用的系统的风格,而不是专门针对xp
回复
clintonus 2011-11-10
[Quote=引用 9 楼 axjuan 的回复:]
我想实现WIN7风格怎么办?求前辈指导。。。。
[/Quote]
win7和xp是同一个res,它好像反正是调用你正在使用的系统的风格,而不是说专门针对xp
回复
xiongkai1988 2011-11-10
谢谢。。。。这是一个经验!!!
回复
clintonus 2011-11-10
谢谢谢谢!很深入透彻了.
我主要只要它不会导致程序在一开始就彻底启动不起来就行,至于可能在一些机器上实在是可能会回到传统windows风格,随它了,不折腾了.
多谢!!
回复
PctGL 2011-11-10
简单来说:
Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
Private Sub Form_Initialize()
InitCommonControls
End Sub

这是必须的,这句函数调用,将导致 comctl32.dll 被加载, comctl32.dll 包含有系统内 xp 样式的风格控件,如果程序开始时没有首先调用此句,则被加载的是另外一个版本的 comctl32.dll 或其他不含有xp风格的控件。

其次:


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="工程1.exe"
type="win32"
/>
<description>WindowsExecutable</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

为必须,如上所示xml文本,系统则称之为 mainfest ,可以文件存储,或以res资源形式附在pe文件上,两者都可以,但出于程序的独立性角度的考虑,放在res中最为方便,而且不会被轻易的意外修改。还有需要注意,这个文本的内容有严格的字节限制。 倒不是多少的问题,主要是。。。我也不是很清楚了,有兴趣多做几个试验就知道了。。。

再,以上文本内容解读:
开始那段为工程信息,程序自定义
之后是程序名的描述
再之后则是最最重要且将影响到程序界面或能否正常执行的内容,
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
这些东西是:
系统盘:\windows\.(这里忘了)..\win32\Microsoft.Windows.Common-Controls\6.0.0.0\X86\6595b64144ccf1df\comctl32.dll

理解了没?manifest存储的是你需要使用的指定风格的 comctl32.dll ,每个 comctl32.dll 包含不同风格、版本的代码

可以搜一下系统盘windows目录,看看能搜到多少个 comctl32.dll

好像说乱了,凑合看吧。。。
回复
hpygzhx520 2011-11-09
无论是资源文件还是.manifest,本质上是一样的,用资源文件满足一些有洁癖的朋友。但程序初始化的时候一定要InitCommonControls,这样稳定性是不会有什么问题的。也许有人说,不加InitCommonControls一样可以运行,但在很多系统上会出现楼主所说无法启动的问题。
我就经历过这样的遭遇。一次传个文件给客户,客户是XP,说无法运行,我当时的直觉是不可能,因为在我的WIN7下没问题嘛……,无奈,到XP下测试,果然不行,加上InitCommonControls,就可以了
回复
未必,这要看系统版本和系统设置情况的。理论上WinXP、Win2003,开启了Themes服务并启用了XP主题,应该总是可行的,至于其他的系统版本或系统设置问题,会不会导致失效就有点难说。
回复
clintonus 2011-11-09
再请教一下,如果我用.manifest文件方式实现的话,这个一定不会有时效性的吧?不管系统怎么升级都能作用的吧?
多谢!!
回复
clintonus 2011-11-06
哦这样的.我用网上搜来的这些.res文件,有的是成功的,有的则会连程序都打不开了直接报错不启动.那看来是有可能不稳定.
我就不知道那些失败的.res文件是不是因为它们是win7还没出来之前做的(xp系统的),因为我想他们贴出这文件来的当时肯定是他们自己测试过可以用的.而我现在是在win7里面测试打开的.如果是这样的话,那就说明这种.res文件会随着系统的升级而失效,如果这样,我的程序采用这种方法显然就不合适了,因为程序是要长久使用的,比如以后升级到win8了,那现在的这个.res文件就又可能失效.
不懂这个,按说它的原理应该跟用.manifest是一样的,我看了下那个.manifest文件好像里面也没涉及到系统信息.

拖在外面就是麻烦一点.但那看来稳定性会好一点.
多谢!!
回复
VB的资源管理器是不能设置类型名为24的,只能是字符串形式的"24",这就是VB做这种事比较困难的地方。
但在VC中就比较简单,因为VC的资源编辑器可以这么设置。
当然,如果结合VC来编辑资源,然后把编辑好的资源文件给VB调用,也是可行的,不过至于稳定性就
有点难说,毕竟两种东西的编译方法不一致。但如果测试成功,应该在大多数情况都是可行的。如果
遇到些例外,这种情况也不是没有可能,只有看到例外情况特殊处理。
但是对于VB来说,感觉拖在外面的情况应该稳定点,毕竟放在资源里是跟随编译的,而VB本身的资源管理
器又不支持这种用法,用别的又有可能影响成功实现目的的稳定性。而放在外面,相对来说,系统会容易
识别一点。
回复
clintonus 2011-11-06
[Quote=引用 1 楼 supermanking 的回复:]
在VB里想不拖额外文件实现XP风格是比较难实现的[/Quote]
不拖额外文件实现XP风格不会难,在工程里加个.res文件就可以,就不用在.exe之外拖一个.manifest文件了.大侠可以试一下,我是在这里下载到的:http://www.codefans.net/down/13627.shtml
我就是想了解下这个方法的稳定性到底怎么样,我在我自己机子上做实验是好的,但是不知道是不是所有机子上都会没问题.
用户要界面漂亮那也没办法,我们自己来说当然功能实现就ok,我也很BS那些花里胡哨的界面,纯粹吃资源的东西,又一点技术含量都没有,纯粹机械的体力活.没办法诶.
谢谢!
回复
其实没必要在界面上太做文章,能用就差不多了,真要在这一块认真起来,水也是很深的。而且XP风格也不见得好看到哪去,虽然实现很简单,但当你实现了后也不会觉得有多特别。在VB里想不拖额外文件实现XP风格是比较难时间的,如果用拖个manifest文件来实现,基本上很简单,根本不用编程。
比如你的程序编译后是“工程1.exe”,你这样做就可以实现XP界面
1、在你的“工程1.exe”相同的目录建立一个空文件,名为“工程1.exe.manifest”
2、用记事本编辑“工程1.exe.manifest”文件内容
3、粘贴以下文本到记事本并保存

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="工程1.exe"
type="win32"
/>
<description>WindowsExecutable</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

4、运行你的“工程1.exe”程序
这时你会发现你界面中的按钮、滚动条选择卡什么都变成了系统样式
回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7518

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2011-11-05 02:59
社区公告
暂无公告