該文檔令人困惑,但正確。您引用的MSDN頁有助於解釋爲什麼你GetObject
電話不會引發錯誤:
If pathname [the first argument] is a zero-length string (""), GetObject returns a new object instance of the specified type. If the pathname argument is omitted, GetObject returns a currently active object of the specified type. If no object of the specified type exists, an error occurs.
這是微妙的,但含義是
GetObject "", "ProjectName.ClassName
實際上相當於
CreateObject "ProjectName.ClassName"
也就是說,將一個空字符串傳遞給第一個參數GetObject
使其操作與CreateObject
完全相同,這意味着它將創建一個新實例的類,而不是返回一個已經運行的實例的引用。
回到MSDN摘錄,它提到將GetObject
的第一個參數全部省略將導致GetObject
返回對已存在的實例的引用。這樣的電話是這樣的:
GetObject , "ProjectName.ClassName" 'Note nothing at all is passed for the first argument'
但是,如果你嘗試這樣做,你會立刻得到一個運行時錯誤。這是文檔所指的不適用於使用VB6創建的類的用例。
這不起作用的原因是由於GetObject
如何發揮其魔力。當省略第一個參數時,它會嘗試通過查詢運行對象表(ROT)(一個包含運行COM對象的機器範圍查找表)來返回現有對象實例。問題是對象必須被創建它們的進程顯式註冊到運行對象表中,以便其他進程可以訪問--VB6運行時不會在ROT中註冊ActiveX EXE類,因此GetObject
無法檢索對已經運行的實例的引用。
完美答案,謝謝。我總是告訴人們RT * M,所以這是我自己的藥的味道! GetObject(,「ProjectName.ClassName)會導致錯誤429,」ActiveX組件無法創建對象「,我想這實際上是我的項目和類設置阻止創建EXE的多個實例 – MarkJ 2009-05-28 08:55:05