2011-10-11 93 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