В VB6, как мне вызвать COM-объект, требующий указатель на объект? - PullRequest
2 голосов
/ 05 июня 2009

У меня проблемы с .NET Assembly, которая видна ком, и вызываю определенные методы из VB6. Я обнаружил, что если параметры имеют четко определенные типы (например, строку), вызовы работают нормально. Если они являются объектами более высокого уровня, возникает ошибка времени выполнения «438», указывающая на отсутствие свойства или метода. Я подозреваю, что это вопрос правильной подписи на вызове, но я не вижу, как это сделать правильно.

Я считаю, что все правильно сделал на стороне .NET (ComVisible, общедоступные интерфейсы и т. Д., И даже рассмотрел это достаточно просто).

Глядя на вывод программы просмотра typelib, я получаю следующее:

dispinterface ISimple {
properties:
methods:
    [id(0x60020000)]
    void Add([in] ISimpleMember* member);
    [id(0x60020001)]
    ISimpleMember* Create();
};

OK. Таким образом, у меня есть 2 метода в моем интерфейсе ISimple. Один принимает ISimpleMember (Add), а другой возвращает ISimpleMember.

Соответствующий код в VB выглядит так:

Dim item As ISimpleMember
Dim simple As simple
Set item = New SimpleMember
item.S1 = "Hello"
item.S2 = "World"
Set simple = New simple
simple.Add (item)           <---- This raised the run time error 438
Set item = simple.Create    <---- This works fine, returning me an ISimpleMember

Я пробовал пару вещей: 1. Затемнить элемент как SimpleMember (без разницы) 2. simple.Add (ObjPtr (item)) - синтаксическая ошибка 3. simple.Add (ByRef item) - Синтаксическая ошибка

В основном, ошибка во время выполнения такая же, как если бы я имел simple.AMethodThatIHaventWritten ()

Кроме того, если я просматриваю Ссылки в среде VB6, метод Add хорошо определен:

Sub Add (участник As SimpleMember)

Ответы [ 2 ]

2 голосов
/ 05 июня 2009

Я нашел ответ, которому верю. Это было очень просто: При вызове подпрограммы я не должен ставить имя в фигурные скобки. звонок должен был быть:

simple.add member

вместо

simple.add(member)

Если я изменяю это на функцию (т.е. возвращаю значение, а не void), скобки необходимы

Кажется, это работает

0 голосов
/ 05 июня 2009

(Вероятно) 3 главных ошибки кодирования VB6, допущенные разработчиками, которые сейчас в основном пишут на C #, Javascript и т. Д.: -

  1. Размещение ; в конце строк. Его синтаксическая ошибка очень легко обнаруживается и подбирается компилятором.
  2. Не помещать Then с другой стороны выражения условия If. Снова синтаксическая ошибка.
  3. Вызов метода без извлечения значения и использования () для включения списка параметров. С несколькими параметрами это синтаксическая ошибка и ее легко найти. Только с одним параметром использование () интерпретируется как выражение. Это результат выражения (), которое передается как параметр. Это вызывает проблемы, когда вызываемый объект ожидает ByRef.
...