这似乎是一个简单的问题,但我追逐论坛几个小时后,我认为这可能是不可能的。
我经常想要将程序从早期绑定转换为后期绑定。通常,它是一个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”)。
答案 0 :(得分:1)
您的简短回答是
IShellWindows
is an interface.
它
提供对打开的Shell窗口集合的访问。
因此
注意:
创建并返回对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)