将早期绑定转换为后期绑定而不更改对象类型

时间:2013-12-16 13:03:41

标签: vba late-binding createobject early-binding

这似乎是一个简单的问题,但我追逐论坛几个小时后,我认为这可能是不可能的。

我经常想要将程序从早期绑定转换为后期绑定。通常,它是一个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”来创建具有后期绑定的CORRECT对象类型。我还希望避免设置“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是库SHDocVw C:\ Windows \ SysWOW64 \ ieframe.dll。

我已经安装OLEVIEW并且可以找到关联IshellWindows“幻数”为CLSID,类型库,并且Inteface(例如界面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”)。

3 个答案:

答案 0 :(得分:1)

您的简短回答是

IShellWindows is an interface.

  

提供对打开的Shell窗口集合的访问。

因此

enter image description here


看看CreateObject() method

注意:

  

创建并返回对COM对象的引用。 CreateObject不能   用于在Visual Basic中创建类的实例,除非这些   类明确地公开为COM组件。

IShellWindows未作为COM组件公开,因此无法说出CreateObject("SHDocVw.IShellWindows")

的原因

当您打开注册表( regedit )并在IShellWindows中搜索密钥时。如果您发现任何意味着您已找到Prog ID,并且您没有找到任何内容,则意味着没有像 IShellWindows 这样的内容被注册为prog ID,因此假设您可以迟到IShellWindows

答案 1 :(得分:0)

我碰到了你试图为自己寻找一些东西的问题。但我不知道你是否尝试了以下内容 -

Set shellwins1 = createobject("Shell.Application")
MsgBox TypeName(shellWins1.Windows)

这回答了您的数据类型问题。它为我打印IShellWindows。我不确定它是否能真正解决你的后期绑定目的,如果这是所需的对象,尽管数据类型是你需要的。

所以,我建议你试一试。

答案 2 :(得分:0)