vba - 从 Visual Foxpro COM 服务器向 VBA 返回对象时出错

标签 vba com visual-foxpro

当我试图从我的 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/

相关文章:

excel - 如何将图标添加到 Excel 菜单/工具栏按钮

c# - 挂接到事件时 C# 中的 COMException

sql - Foxpro:通过vfpoledb检查表是否存在

excel - 无法将所有行从 FoxPro 导出到 Excel?

indexing - Visual FoxPro 紧凑索引文件格式

vba - 通过规则删除附件的 Outlook 脚本

arrays - 当字符小于 255 时 VBA FormulaArray 范围类错误

c++ - 加载接口(interface)失败

c# - 应用程序调用了为不同线程编码的接口(interface)

ms-access - 双击列表框打开特定记录的表格