У меня проблемы с .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)