当我试图从我的 Visual Foxpro COM 服务器向 VBA 返回一个新对象时,我收到以下消息。 “运行时错误‘-2147417851 (80010105)’:
对象'Itestclass'的方法'ReturnObject'失败"
如果我删除“Dim ... As”行,错误就会消失,但我会失去 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") 更改为 RETURN CREATEOBJECT("CUSTOM"),但问题仍然存在。
请告诉我如何在不丢失 VBA 中 COM 对象的智能感知的情况下摆脱这个错误。谢谢
最佳答案
我不知道为什么你会遇到这样的困难......这应该可以帮助你......你可以将你的类定义为 OlePublic 并在其上设置一些属性,就像顶部的示例一样。您可以通过其他非隐藏功能在任何地方设置这些属性。
如果您需要尝试获取其他“对象”的某些元素,请尝试创建该对象的实例并将其粘贴到 OlePublic 类的属性中...请参阅我的方法
做点什么
它对类的“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 获得的任何内容。
如果您想公开多个对象类,并在中央控制下,您始终可以创建用于通信的主要对象,并让 IT 在其上创建每个“其他”类的实例。然后,在您的主类上公开方法来处理它们之间的通信,以执行您需要的任何操作。
关于vba - 从 Visual Foxpro COM 服务器向 VBA 返回对象时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7729220/