这似乎是一个简单的问题,但我在追逐论坛几个小时后认为这可能是不可能的。
我经常想将程序从早期绑定转换为后期绑定。通常,它是一个 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”的引用。换句话说,我希望代码看起来像这样:Sub LateBind()
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”)。