2

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

我经常想将程序从早期绑定转换为后期绑定。通常,它是一个 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”)。

4

3 回答 3

1

你的简短回答是

IShellWindows是一个接口。

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

所以

在此处输入图像描述


看一下CreateObject() 方法

笔记:

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

IShellWindows没有作为 COM 组件公开所以这就是为什么没有办法说CreateObject("SHDocVw.IShellWindows")


当您打开注册表 ( )regedit并搜索键入. IShellWindows如果你找到任何东西,这意味着你已经找到了你的 Prog ID,如果你没有找到任何东西,这意味着没有像IShellWindows这样的东西被注册为 prog Id,因此假设你不能后期绑定是有意义的IShellWindows

于 2013-12-16T13:36:22.357 回答
0

我碰到了你的问题,试图为自己找到一些东西。但我不知道您是否尝试过以下方法 -

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

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

所以,我建议你试一试。

于 2015-05-31T09:38:57.210 回答