Соответствие vbObjectError между VB NET и VB6

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ozyabkin
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 16.11.2005 (Ср) 0:02

Соответствие vbObjectError между VB NET и VB6

Сообщение ozyabkin » 02.02.2025 (Вс) 21:49

Добрый день.

Создана динамическая библиотека dsaLib с модулем класса clsDSA. Библиотека поддерживает регистрацию для COM-взаимодействия, т.е. при компиляции создаются два файла dsaLib.dll и dsaLib.tlb

Допустим, что в VB NET в теле функции LoadData класса clsDSA при обработке исходных данных генерируется ошибка.

Код: Выделить всё
Err.Raise(vbObjectError + 103, "dsaLib\clsDSA\LoadData", "Не соответствие размеров x и y")


В VB6 имеется вызов функции, например чтения данных

Код: Выделить всё
Sub Main
Dim x() as Double, y() as Double
Dim dsa As New dsaLib

On Error Goto 1
call dsa.LoadData(App.path & "data.dat", x, y)
Exit Sub

1: MsgBox Err.Number & ": " & Err.Description
End Sub


При компиляции и выполнении алгоритма функция MsgBox отображает номер ошибки vbObjectError + &HF1500
независимо от генерируемой ошибки в динамической библиотеке.

Т.е. задавая номер ошибки от vbObjectError + 1 до vbObjectError + 500, при выполнении программы в VB6 всегда выдаёт ошибку vbObjectError + &HF1500.

ПОДСКАЖИТЕ ПОЖАЛУЙСТА, ЧТО НЕВЕРНО?
КАК ПОЛУЧИТЬ ДЕЙСТВИТЕЛЬНЫЙ НОМЕР ОШИБКИ?

P.S. При выполнении команды в динамической бибилиотеке MsgBox Err.Number - vbObjectError VB NET отображает код ошибки 103, а в VB6 - Err.Number = &H80131500.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16485
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Соответствие vbObjectError между VB NET и VB6

Сообщение Хакер » 07.02.2025 (Пт) 21:24

ozyabkin писал(а):Библиотека поддерживает регистрацию для COM-взаимодействия, т.е. при компиляции создаются два файла dsaLib.dll и dsaLib.tlb


Нет, не «то есть». Регистрация это одного, а создание рядом TLB-файла это совсем другое. Вещи друг с другом не связанные, не тождественные, друг от друга не зависящие.

ozyabkin писал(а):ПОДСКАЖИТЕ ПОЖАЛУЙСТА, ЧТО НЕВЕРНО?

Неверно то, что 0x80131500 это HRESULT-код COR_E_EXCEPTION — судя по всему код, используемый для произвольного исключения в среде .NET.

VB6 и VBA с одной стороны и VB.NET с другой стороны используют разные механизмы для обработки ошибок.

VB6 использует SEH-исключения для процедур модулей, а для для процедур классов/интерфейсов — возврат кода HRESULT как минимум, а бонусом предоставление доп. информации через COM-интерфейс IErrorInfo.

VB.NET использует .NET-исключения.

На границе между .NET-средой и классической средой, судя по всему, любые .NET-исключения превращаются в HRESULT-код H80131500.

Чтобы ответить на вопрос, как это преодолеть, нужно быть дотнетчиком, а у меня это зло даже не установлено в системе. Но возможно решение проблемы состоит в том, чтобы со стороны VB.NET вместо Err.Raise использовать Throw, а объекту исключение перед выбрасыванием выставлять через свойство HResult нужное значение — и тогда именно оно будет видеться со стороны VB6/VBA/Delphi/C/C++/PHP и всего остального.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, PetalBot и гости: 8

    TopList