2013-12-16 40 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。我不確定它是否真的可以解決你的意圖,如果這是所需的對象,但是數據類型是你所需要的。

所以,我建議你試試看。

相關問題