2011-10-11 94 views
3

當我嘗試從Visual Foxpro COM服務器返回一個新對象到VBA時,我收到以下消息。 「運行時錯誤‘-2147417851(80010105)’:從Visual Foxpro COM服務器返回對象到VBA時出錯

Method對象的「返回object'Itestclass失敗」

如果我刪除了「昏暗......作爲」行錯誤消失,但那麼我就失去了COM對象的智能感知。

這是VBA代碼:

Sub Test() 

'' Removing the following line gets rid of the error but loses intellisense for the COM object 
Dim objTest As testcom.TestClass 

Set objTest = CreateObject("TestCOM.TestClass") 
Set objNew = objTest.ReturnObject '' This is the line that causes the error 

End Sub 

我創建了一個鏈接到工具的TestCOM類型庫>參考

這裏是在Visual FoxPro(VFP)代碼: 的COM服務器作爲一個進程EXE進行構建。如果我將它構建爲進程.DLL,那麼VBA代碼會導致Excel崩潰。

DEFINE CLASS ObjectToReturn AS SESSION OLEPUBLIC 

ENDDEFINE 

DEFINE CLASS TestClass AS SESSION OLEPUBLIC 

FUNCTION ReturnObject 

    RETURN CREATEOBJECT("ObjectToReturn") 

ENDFUNC 

ENDDEFINE 

我曾試圖改變RETURN CREATEOBJECT( 「ObjectToReturn」)返回CREATEOBJECT( 「自定義」),但問題仍然存在。

請告知我怎樣才能擺脫這種錯誤又不失智能感知在VBA的COM對象。由於

+0

這是RPC_E_SERVERFAULT,您的COM服務器引發異常。爲什麼是不可猜測的。 –

+0

@ hans-passant感謝您的額外信息。基於症狀,我'猜測'這是與早期與晚期綁定和類型庫有關,但除此之外,我迷路了。 – Caltor

+0

我無法想象我是唯一一個曾經希望從VFP返回一個對象到VBA的對象,而不會失去智能感知,即早期綁定 – Caltor

回答

0

我不知道爲什麼你正在經歷這樣的困難......這應該能夠幫助你...你可以定義你的類爲OLEPUBLIC並在其上設置一些屬性,如頂部的樣品。您可以通過其他非HIDDEN函數在任何位置設置這些屬性。

如果需要試圖讓在其他一些「對象」,可以嘗試創建對象的實例,並將其粘在OLEPUBLIC類的屬性某些元素......看到我的方法

DoSomethingElse

它做一個簡單的分散NAME調用類的「SomeObject」屬性。即使你沒有明確地返回了,它應該是從你從VB它創作中可見......

DEFINE CLASS VFPClassForVB as Session OLEPublic 
    cTmpFiles = "" 
    cCOMUser = "" 
    SomeObject = "" 

    FUNCTION Init() 
    */ Who is user... always ignore the machine.... 
    This.cCOMUser = SUBSTR(SYS(0), AT("#", SYS(0)) +1) 
    This.cTmpFiles = "somepath\" 

    */ Unattended mode... any "MODAL" type dialog will throw error/exception 
    SYS(2335, 0) 

    */ ALWAYS HAVE EXCLUSIVE OFF FOR COM!!! 
    SET EXCLUSIVE OFF 

    */ ALWAYS HIDE DELETED RECORDS!!! 
    SET DELETED ON 
    ENDFUNC 

    */ Error handler at the CLASS level will always be invoked 
    */ instead of explicit ON ERROR or TRY/CATCH handlers... 
    FUNCTION xError(nError, cMethod, nLine) 
    lcMsg = "User: " + SYS(0) + " Tmp:" + SYS(2023); 
     + " Method: " + cMethod + " Error: " + STR(nError,5); 
     + " Line: " + STR(nLine, 6) 
    STRTOFILE(lcMsg, This.cTmpFiles + "COMLog.txt") 

    */ NOW, throw the COM Error... 
    COMReturnError(cMethod + ' Error:' + str(nError,5); 
     + ' Line:' + str(nline,6); 
     + ' Msg:' + message(), _VFP.ServerName) 
    RETURN 


    HIDDEN FUNCTION SomeOtherFunction(lcWhat String,; 
        lnThing as Integer) as String 

    */ Do something 
    RETURN 1 
    ENDFUNC 

    */ Another completely visible function direct form VB 
    FUNCTION DoSomethingElse(SomeParameter as String) as String 
    USE SomeTable 
    */ Now, this object should be visible as a direct property in VB 
    SCATTER MEMO NAME This.SomeObject 
    ENDFUNC 

ENDDEFINE 

你的VB的一面,甚至從你的樣品......

Sub Test() 
Set objTest = CreateObject("MySampleProject.VFPClassForVB") 
objTest.DoSomethingElse("I dont care") 
dim Something as objTest.SomeObject.ColumnFromTable 
End Sub 

你可以在您想要公開的代碼內類庫中創建許多OlePublic類,並根據需要創建這些實例。讓我知道這是否有助於您更近距離,我們會盡力繼續努力。

我已經試過各種樣本,但看着你有對象的什麼地方都是VFP OLEOBJECT條目,每個條目被暴露,並且可以單獨創建。你不需要創建一個來創建另一個。

是有一些原因,具體的你正試圖從另一個創建一個對象?你可以讓一個對象公開一些方法和屬性來執行VFP所需的任何操作。

如果你想有暴露多個對象類,以及中央控制下,可以隨時創建主對象的溝通和有它,它創建的每一個「其他」類的一個實例。然後,暴露主類中的方法,以處理它們之間的通信,以執行任何您需要的操作。

+0

感謝您的建議,但我認爲你可能會稍微誤解了這個問題。我無法獲得任何對象在VFP COM服務器和VBA(MS Excel 2007)程序之間傳遞。我現在已經嘗試在VFP或VBA中創建對象,但是我無法向它傳遞方向:( – Caltor

+0

我已經擴展了答案並在您的需求中添加了問題。 – DRapp

+0

我正在編寫VFP COM服務器,但第三方客戶端將會編寫VBA代碼,因此我試圖儘可能簡單地創建「子」對象,這是我創建一個對象的具體原因,我從代碼中看到可以創建一個公共屬性來保存可以從VBA客戶端訪問的新對象;但是如何處理多個對象?由於主類'TestClass'將有多個子項,我實際上需要將公共屬性作爲一個集合,但在這種情況下,VBA客戶端無法傳遞該對象 – Caltor