Ошибка возврата объектов в VBA с COM-сервера Visual Foxpro - PullRequest
3 голосов
/ 11 октября 2011

При попытке вернуть новый объект в VBA с моего COM-сервера Visual Foxpro я получаю следующее сообщение. «Ошибка времени выполнения -2147417851 (80010105)»:

Метод 'ReturnObject' объекта 'Itestclass' не выполнен '

Если я удалю строку "Dim ... As", ошибка исчезнет, ​​но я потеряю intellisense для 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"), но проблема сохраняется.

Посоветуйте, пожалуйста, как я могу избавиться от этой ошибки, не теряя intellisense для COM-объекта в VBA. Спасибо

1 Ответ

0 голосов
/ 15 октября 2011

Я не знаю, почему вы сталкиваетесь с такими трудностями ... Это должно помочь вам ... Вы можете определить свой класс как OlePublic и установить для него некоторые свойства, такие как примеры вверху. Вы можете установить эти свойства в любом месте с помощью других функций, которые не скрыты.

Если вам нужно получить определенные элементы OF какого-то другого «объекта», попробуйте создать экземпляр объекта и вставить его в свойство класса OlePublic ... см. Мой метод

DoSomethingElse

, который выполняет простой запрос NAME scatter к свойству 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.

Если вы хотите, чтобы несколько классов объектов были открыты и находились под централизованным управлением, вы всегда можете создать свой первичный объект для связи, и ИТ-специалисты должны создать на нем экземпляр каждого «другого» класса. Затем предоставьте методы в вашем главном классе, чтобы обрабатывать связи между ними, чтобы разыграть все, что вам нужно.

...