【发布时间】:2013-12-16 13:03:40
【问题描述】:
这似乎是一个简单的问题,但我在论坛追了几个小时后,我认为这可能是不可能的。
我经常想将程序从早期绑定转换为后期绑定。通常,它是一个 vba、Visual Basic 应用程序、在 Excel 2010 和 windows 7 pro 下运行的程序。
出于讨论的目的,我们假设它是以下内容。
Sub EarlyBind()
' use IDE > Tools > references > and select “Microsoft Internet Controls”
Dim shellWins1 as shdocvw.shellwindows
Line1: Set shellWins1 = New SHDocVw.ShellWindows
MsgBox TypeName(shellWins1) ' this will display “IShellWindows”
' other code that expects to be working with an IshellWindows object …..
End Sub
根据我的经验,将这样的程序转换为后期绑定有时很困难。
例如,我发现一些论坛建议我将其更改为
Set shellwins1 = createobject("Shell.applicaton")
但这会创建一个 IShellDispatch5 对象,而不是 IshellWindows 对象。这意味着我必须更改其他代码以适应新的对象类型。当然,我必须测试其他代码是否存在细微差别。
所以,我的目标是找到一个通用解决方案,让我可以重写“Line1”以创建具有后期绑定的正确对象类型。我还希望避免设置对“Microsof Internet Controls”的引用。换句话说,我希望代码如下所示: 子后期绑定()
Dim shellWins1 as object
Line1: Set shellWins1 = createobject(“xxxxxx.yyyyyy”).zzzzzz
MsgBox TypeName(shellWins1) ‘ this should display “IShellWindows”
….. other code that expects to be working with an IshellWindows object …..
End Sub
我知道如何使用 vba IDE 来查找与对象关联的 dll。在这种情况下,dll 是 Library SHDocVw C:\Windows\SysWOW64\ieframe.dll。
我已经安装了 OleView,并且可以找到与 clsId、TypeLib 和接口相关的 IshellWindows“幻数”(例如接口是 85CB6900-4D95-11CF-960C-0080C7F4EE85)。
但是,我不知道如何将它们转换为可以在上面发布的示例代码中的 line1 中使用的程序 id。
我希望这里有人可以提供帮助。 ------ 在 MeHow 的帮助下,我现在有了答案! ------
将“set myObj = new xxxx.yyyyy”切换为任意对象类型的后期绑定
Change set myObj = new xxxx.yyyyy
into set myObj = CreateObject("xxxx.yyyyy")
这通常会奏效。
但是,在某些情况下,(例如“shDocVw.ShellWindows。”)它会给出错误 429 ActiveX 组件无法创建。
当这种情况发生时,我完全不走运。不可能对那个 EXACT 对象类使用后期绑定。相反,我必须找到一个替代类来做大致相同的事情。 (例如“Shell.Application”)。
【问题讨论】:
-
也许可以试试this(我没用过,所以我不能推荐)
-
是的,这是关于使用 Shell.Application 作为 shDocVw.ShellWindows 的替代技术的一个很好的链接。而且,我过去曾成功使用过这些技术。今天的问题集中在如何避免这种替代方案,但事实证明,使用后期绑定是不可能的。
-
没错。我们试过...
标签: vba late-binding createobject early-binding