Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 8146|回复: 11

[已解决]excel2003和2007中scrrun.dll加载的问题

[复制链接]
发表于 2010-11-22 22:58 | 显示全部楼层 |阅读模式

我一直以为在VBE中用dim as new (前期绑定)或者用createobject方法(后期创建)来建立了dictionary对象,这个对象是事后(即在执行了引用或者创建的动作之后,该scrrun.dll链接库才会被加载,但研究了一下,貌似不是这样。

并且好像在2003和2007的版本中有所不同。

2007中,打开excel2007时,scrrun.dll就已经被加载。如下:

既然如此,为何,还需要用createobject来创建对象呢???

而2003中:

excel刚被打开的时候,并没有加载scrrun.dll。只有在执行了引用或者创建的动作后,scrrun.dll才会被加载。


 

另有1问,既然2007版本已经事先加载了scrrun.dll链接库,那是不是说,2007版本创建字典对象的速度会快于2003版本??

最佳答案
2010-11-23 10:03

我现在想是不是还有另一种可能,Excel2007里找开的scrrun.dll并不是为VBA打开的,而是Excel.exe应用程序里用到的.所以在VBA里并没有相应的DLL信息.

就好比如果我们先打开2007,并且引用Microsoft Scripting Runtime,这时在2007里可以直接引用字典,Dim dic as New Dictionary

并且scrrun.dll也确实被装进内存,

现在,我们再同时打开2003,在其VBE中如果不引用Microsoft Scripting Runtime,便不可以直接引用字典。

所以,装载DLL是谁都可以做的事情,但不是DLL加载VBA就可以立即使用,还要另外加个引用的动作(估计是找到DLL的入口之类)。

以上是我对为什么2007已经加载了scrrun.dll,但依然要显式的引用Microsoft Scripting Runtime的原因。

 楼主| 发表于 2010-11-22 23:03 | 显示全部楼层
回复

使用道具 举报

发表于 2010-11-22 23:14 | 显示全部楼层

我不懂,我理解是,只能证明加载了scrrun.dll链接库,但不能证明被excel引用了这个dll(excel引用了才能用字典)

就像ep里看到在线人数增加了,但不能证明你一定爬上来了。

瞎比喻,睡觉了[em04]

回复

使用道具 举报

发表于 2010-11-23 08:14 | 显示全部楼层

不懂了。学的没头绪

回复

使用道具 举报

发表于 2010-11-23 08:42 | 显示全部楼层

CreateObject函数里包含了创建对象的方法,要创建对象,当然必须打开相应的DLL,但是找打DLL(DLL调入内存)并不是必须的,而是可选的,应该是DLL已经打开,则忽略,DLL没打开则要负责找开。

2007里一开始便打开了scrrun.dll,这点没注意过。这样做的结果是,如果代码有调用scrrun.dll里的功能,则速度加快了,如果不调用scrrun.dll里的功能,找开Excel时会稍微慢一点,但是可能会因为差别小而没什么感觉。其实就算有感觉又能怎样呢,Excel每次找开都会加载许多我们用不到的功能。

第一次使用CreateObject,会打开scrrun.dll,直到Excel结束。以前我想前绑定与后绑定的差别在于有没有先加载DLL,现在我想前绑定除此之外也许还做了一些其它的工作

回复

使用道具 举报

 楼主| 发表于 2010-11-23 09:08 | 显示全部楼层

QUOTE:
以下是引用吕?布在2010-11-23 8:42:00的发言:

CreateObject函数里包含了创建对象的方法,要创建对象,当然必须打开相应的DLL,但是找打DLL(DLL调入内存)并不是必须的,而是可选的,应该是DLL已经打开,则忽略,DLL没打开则要负责找开。

2007里一开始便打开了scrrun.dll,这点没注意过。这样做的结果是,如果代码有调用scrrun.dll里的功能,则速度加快了,如果不调用scrrun.dll里的功能,找开Excel时会稍微慢一点,但是可能会因为差别小而没什么感觉。其实就算有感觉又能怎样呢,Excel每次找开都会加载许多我们用不到的功能。

第一次使用CreateObject,会打开scrrun.dll,直到Excel结束。以前我想前绑定与后绑定的差别在于有没有先加载DLL,现在我想前绑定除此之外也许还做了一些其它的工作

如果2007版本事先就已经加载了scrrun.dll,在代码运行的过程中只是起到了调用到内存中的作用。那为何用用createobject而不用getobject呢?如果一个程序已经在运行不应该是用getobject吗?可是貌似getobject是错的??

回复

使用道具 举报

发表于 2010-11-23 10:03 | 显示全部楼层    本楼为最佳答案   

我现在想是不是还有另一种可能,Excel2007里找开的scrrun.dll并不是为VBA打开的,而是Excel.exe应用程序里用到的.所以在VBA里并没有相应的DLL信息.

就好比如果我们先打开2007,并且引用Microsoft Scripting Runtime,这时在2007里可以直接引用字典,Dim dic as New Dictionary

并且scrrun.dll也确实被装进内存,

现在,我们再同时打开2003,在其VBE中如果不引用Microsoft Scripting Runtime,便不可以直接引用字典。

所以,装载DLL是谁都可以做的事情,但不是DLL加载VBA就可以立即使用,还要另外加个引用的动作(估计是找到DLL的入口之类)。

以上是我对为什么2007已经加载了scrrun.dll,但依然要显式的引用Microsoft Scripting Runtime的原因。

回复

使用道具 举报

 楼主| 发表于 2010-11-23 10:34 | 显示全部楼层

有可能吧。

算了,涉及到windows底层应用的问题了,暂且不研究它了。。

 

[em01]
回复

使用道具 举报

 楼主| 发表于 2010-11-23 10:40 | 显示全部楼层

我将scrrun.dll从system32文件夹中剪掉之后,照样能打开2007,并且测试了很多2007新的功能都没有发现异常。。。算了。。研究不出来。

回复

使用道具 举报

发表于 2010-11-23 10:51 | 显示全部楼层

我剪切不了,那你看一下剪切后再打开2007那个DLL还有没有被加载呢?系统有没有重新生成呢(有的系统DLL你删除后他能自动修复,生新生成)?

如果真的没有了,有没有可能Excel能容错呢,只是某个功能出问题,而不是整个应用程序不能打开呢.

回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 03:32 , Processed in 0.170607 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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