ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 9309|回复: 29

[分享] 初始化excel引用的VB控件,使excel引用的DLL具有XP风格

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-15 21:19 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:控件
本帖最后由 fecmen 于 2012-12-14 12:55 编辑

初始化excel引用的VB控件,使excel引用的VB生成的DLL中的控件具有XP风格

前提条件,需要引用comctl32.dll(版本6)来作为VB生成的DLL中的控件。 
工具栏控件一定要用Microsoft Windows Common Controls 5.0,而不要用Microsoft Windows Common Controls 6.0。

适用环境:Office2003、Office2007、Office2010

效果:执行Excel引用的DLL中的相关命令,窗体中的textbox、滚动条等具有XP风格,从此告别单调的VB风格了。

附件在Excel2003、Excel2010的环境下测试成功,Excel2007未测试( 现已测试通过并更新了代码)

个人认为此方法是目前是自己编写的Excel所引用的VB控件具有XP风格最有效、简便的方法,且具有安全性。如果这不安全的话,那么目前市面上的VB程序具有XP风格的程序采用代码初始化VB控件的方法均不安全,因为此方法与之实现原理基本一致。

已测试通过系统环境:
1、Windows系统:xp系统、Win7系统
2、Excel版本:excel2003、excel2007、excel2010版本

更新情况:
2012.10.19      更新了Win7环境下程序以管理员权限运行的功能
2012.10.20      更新了代码,修复了Office2007下出错的情况。

注:Win7系统环境下如果使用者不能不能成功注册测试文件附带的DLL文件,
可以使用Excel加载文件管家注册,见  http://club.excelhome.net/thread-729100-1-1.html
      XP系统中不存在上述注册问题。





用工具初始化VB控件后的状态-------------------

用工具初始化VB控件后的状态-------------------

VB控件初始状态-------------------

VB控件初始状态-------------------

初始化Excel引用VB控件XP风格.rar

8.28 KB, 下载次数: 261

现在可以在win7环境下以管理员权限运行

测试文件.rar

14.55 KB, 下载次数: 178

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-16 09:41 | 显示全部楼层
本帖最后由 fecmen 于 2012-10-20 08:53 编辑

上传附件有改进了,修改了部分Bug。如果运行之前的附件有问题的,导致excel不能正常启动的,可以重新运行下新的附件便能修复。

xp下的情况

xp下的情况

win7下的情况

win7下的情况

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-16 16:22 | 显示全部楼层
此功能的实现原理:在excel.exe的根目录下生成excel.exe.manifest,就这么简单。网上有不少关于使.exe程序XP风格化的例子,基本都采用manifest方法来实现的,本程序也不例外。如有高手能采取之外的方法,希望能起到抛砖引玉的效果。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-16 16:27 | 显示全部楼层
本帖最后由 fecmen 于 2012-7-16 19:22 编辑

excel2003根目录下原程序无excel.exe.manifest文件,excel启动也不依赖该文件,我们可以直接将能使VB程序XP风格化的尾巴文件  <程序名>.exe.manifest  ,修改程序名为excel.exe.manifest,然后将该文件与excel.exe放在一起,那么excel引用的VB生成的DLL就具有XP风格了,如果想还原回去,直接删掉excel.exe.manifest文件便可。
      嘿嘿,excel2003具有自动加载上述文件的功能,不用我们考虑在VB程序中,在所有窗体加载之前调用InitCommonControlsEx函数从comctl32.dll(版本6)中对组件类进行初始化这一步骤了。感叹微软的牛吧。

     此适用于excel2003版本的excel.exe.manifest中的xml文件内容为:

<?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="vbAccelerator.XPStylesTester.XPStylesTester"
    type="win32"
/>
<description>VB code converter.</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>  



abc.exe.manifest.rar

449 Bytes, 下载次数: 52

此附件如果修改为excel.exe.manifest就可使excel2003引用dll具有xp风格,但不可用于excel2010,切记!如果用 ...

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-16 16:33 | 显示全部楼层
而excel2007、excel2010就和excel2003不一样了,在系统的根目录下,就已经存在excel.exe.manifest文件了。如果直接将4楼中的excel.exe.manifest文件替换之,就会导致excel不能正常启动。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-16 16:34 | 显示全部楼层
本帖最后由 fecmen 于 2012-7-17 11:41 编辑

office2010中的自带的excel.exe.manifest文件中的XML内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><noInherit></noInherit><assemblyIdentity version="11.0.0.0" processorArchitecture="*" name="excel" type="win32"></assemblyIdentity><description>Microsoft Excel</description><dependency><dependentAssembly><assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity></dependentAssembly></dependency><trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"><security><requestedPrivileges><requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel></requestedPrivileges></security></trustInfo><compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
  <application>
   
   <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"></supportedOS>
  </application>
</compatibility><asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
  <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
   <dpiAware>true</dpiAware>
  </asmv3:windowsSettings>
</asmv3:application></assembly>

上述内容是系统自带,且是必须的,如果错误Excel将不能正常启动运行。那如何使Excel2010能使VB生成的DLL具有XP风格呢?我们在上面的XML内容上动动心思。看看能否将上面的内容和使VB生成的DLL具有XP风格的manifest中的XML内容进行整合?

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-17 11:43 | 显示全部楼层
本帖最后由 fecmen 于 2012-7-17 11:49 编辑

答案是可以的!Excel2010中的excel.exe.manifest中的XML内容修改后的情况如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><noInherit></noInherit><assemblyIdentity version="11.0.0.0" processorArchitecture="*" name="excel" type="win32"></assemblyIdentity><description>Microsoft Excel</description><dependency><dependentAssembly><assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity></dependentAssembly></dependency><trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"><security><requestedPrivileges><requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel></requestedPrivileges></security></trustInfo><compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
            
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"></supportedOS>
        </application>
    </compatibility><asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>true</dpiAware>
        </asmv3:windowsSettings>
    </asmv3:application>
    <description>VB code converter.</description>
    <dependency>
    <dependentAssembly>
    <assemblyIdentity
    type="win32"
    name="Microsoft.Windows.Common-Controls"
    version="6.0.0.0"
    processorArchitecture="X86"
    publicKeyToken="6595b64144ccf1df"
    language="*"
    />
   </dependentAssembly>
   </dependency>
   </assembly>

大家如果将Excel2010安装目录下的excel.exe.manifest文件以写字板方式打开的话,将上面修改后的XML内容复制进去再保存。那么重新打开Excel2010,就会发现Excel2010引用的VB生成的DLL具有XP风格了。不错吧。。。。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-10-19 18:31 | 显示全部楼层
fecmen 发表于 2012-10-19 18:21
win7下excel引用dll好像是有点权限的问题。程序本身是没问题的。我先研究下excel引用dll在win7下为何出现问 ...

xp  excel2007 "初始化Excel引用VB控件XP风格.rar"初始化后,EXCEL.exe不能打开任何EXCEL格式的文件,
也恢复不了。我已卸载重装EXCEL

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-19 18:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
win7下excel引用dll好像是有点权限的问题。程序本身是没问题的。我先研究下excel引用dll在win7下为何出现问题吧。你可试试excel下的com加载宏的。程序效果是没问题的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-19 15:01 | 显示全部楼层
一楼的附件已经更新了,程序可以在Win7环境下以管理员身份运行。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-22 01:19 , Processed in 0.055532 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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