2013-12-16 43 views
2

这似乎是一个简单的问题,但我追逐几个小时的论坛后,我认为这可能是不可能的。将早期绑定转换为后期绑定而不更改对象类型

我经常想将程序从早期绑定转换为后期绑定。通常,它是一个vba,应用程序的可视化基础,在Excel 2010和Windows 7专业版下运行的程序。

为了便于讨论,我们假设它是以下内容。

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控件的引用。换句话说,我想要的代码看起来像这样: 子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的帮助,我现在有了答案! ------

要切换“设置MyObj中=新xxxx.yyyyy”来晚了任意对象类型

Change set myObj = new xxxx.yyyyy 
into set myObj = CreateObject("xxxx.yyyyy") 

很多时候,将工作结合。

但是,在某些情况下(例如“shDocVw.ShellWindows。”)它会给出错误429 ActiveX组件无法创建。

当发生这种情况时,我完全失去了运气。使用该EXACT对象类的后期绑定是不可能的。相反,我必须找到一个类似的替代课程。 (例如“Shell.Application”)。

+0

也许试试[**这**](http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_22489757.html)(* ive从未使用它,所以我可以' t推荐*) – 2013-12-17 10:33:16

+1

是的,这是关于使用Shell.Application作为shDocVw.ShellWindows的替代方法的技术链接。而且,我过去成功地使用了这些技术。今天的问题集中在避免这种选择的方法上,但是后期的约束是不可能的。 – user3107264

+0

这是正确的。我们尝试了... – 2013-12-17 12:05:00

回答

1

你简短的回答是

IShellWindows is an interface.

可访问已打开shell窗口的集合。

因此

enter image description here


看一看的CreateObject() method

注:

创建并返回到一个COM对象的引用。除非那些 类明确公开为COM组件,否则CreateObject不能使用 在Visual Basic中创建类的实例。

IShellWindows不外露的COM组件所以这就是为什么没有办法说CreateObject("SHDocVw.IShellWindows")


当您打开注册表(regedit)和搜索关键类型IShellWindows。如果你发现任何东西,这意味着你已经找到你的编程ID,如果你没有找到任何东西,这意味着没有什么像IShellWindows被注册为编程ID,因此它是有道理的,假设你不能迟交IShellWindows

+0

+ 1您正在着火; p –

+0

我澄清了我的第一篇文章,内容是“我也希望避免需要设置对”Microsoft Internet Controls“的引用。考虑到这一点,我相信您现在可以理解为什么我需要将它变暗为Object,它也会让你提到的错误消失 – user3107264

+0

我是这个网站的新手我可以直接编辑你的回复吗 – user3107264

0

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

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

这会回答你对数据类型的问题。它为我打印IShellWindows。我不确定它是否真的可以解决你的意图,如果这是所需的对象,但是数据类型是你所需要的。

所以,我建议你试试看。

相关问题