При импорте через TLB некорректно обрабатывается [retval]

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

При импорте через TLB некорректно обрабатывается [retval]

Сообщение tyomitch » 10.08.2007 (Пт) 13:42

Хочу:

Код: Выделить всё
[
    dllname("MSVBVM60.DLL")
]
module msvbvm60 {

    [entry("GetMem4")]
    void Peek(
   [in] LONG Address,
   [out, retval] LONG* Value);

}


Но VB, зараза, кладёт в стек один параметр, и ждёт результат в eax.

Если объявить функцию как HRESULT вместо void, только тогда до VB допирает, что параметров два.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.08.2007 (Пт) 14:42

TLB, в которой [out, retval] struct * foo; -- валит среду VB замертво, даже при открытии Object Browser-а.
Эх.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.08.2007 (Пт) 15:07

Ещё среда VB валится замертво при попытке запуска или компиляции кода, в котором в операторе With используется функция, возвращающая IUnknown.

Кошмар, сколько там волчьих ям припасено любителям самописных TLB.
Изображение

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

Сообщение Хакер » 10.08.2007 (Пт) 17:28

Угу. А ещё [in] long foo и long *foo отображаются в Object Browser-е одинакого, как будто в обоих случаях аргумент ByRef-ный.

А по сабжу-... не знаю. Если это глупый баг, то возможно придётся смириться.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.08.2007 (Пт) 17:45

Хакер писал(а):Угу. А ещё [in] long foo и long *foo отображаются в Object Browser-е одинакого, как будто в обоих случаях аргумент ByRef-ный.

Это не баг, а просто отсутствие фичи.

Ещё: я не понял, баг это или фича, но для [in, defaultvalue(NULL)] long *foo при опущенном параметре передаётся ноль по ссылке, вместо нулевой ссылки.
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 10.08.2007 (Пт) 23:12

tyomitch
Можно вопрос, а зачем With натравливать на IUnknown?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.08.2007 (Сб) 10:40

Случайно.
И я рассчитывал на ошибку компиляции, а не на моментальный всеразрушающий крэш.
Изображение


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 91

    TopList