GetLastError в VB?

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

GetLastError в VB?

Сообщение 0xy » 26.01.2010 (Вт) 20:39

Недавно заметил, что GetLastError иногда врет:
Код: Выделить всё

GetProcAddres(GetModuleHandle("kernel32"),"X_3_")
N=GetLastEror

В этом примере почему-то N=0, хотя должно быть 126. Интересно: почему так?

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

Re: GetLastError в VB?

Сообщение Хакер » 26.01.2010 (Вт) 20:51

Напиши два раза. Во второй раз врать не будет?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: GetLastError в VB?

Сообщение 0xy » 27.01.2010 (Ср) 0:56

Это что, прикол из серии "переставить Винду 5 раз подряд"? :)
PS
Проверил--все равно врет! (два GetLastError подряд).

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

Re: GetLastError в VB?

Сообщение Хакер » 27.01.2010 (Ср) 1:32

Нет, это не прикол, это здравая логика: если GetProcAddress устанавливает код ошибки, то при первом вызове GetLastError выполняется GetProcAddress(..., "GetLastError"), который может сбить ошибочный код возврата успешным (ведь GetLastError нашлась).

При втором вызове резолвинга не происходит, адрес берётся из специальной таблицы внутри-VB-шного-Declare-основанного импорта. Но видимо код ошибки сбрасывается чем-то иным.

В любом случае Err.LastDllError возвращает правильный результат. И это, кстати, вовсе не 126 («Не найден указанный модуль»), а 127 («Не найдена указанная процедура»).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: GetLastError в VB?

Сообщение 0xy » 27.01.2010 (Ср) 3:58

Да, все верно.
Значит, вместо GetLastError всегда следует использовать указанный метод err?

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

Re: GetLastError в VB?

Сообщение Хакер » 27.01.2010 (Ср) 4:00

Вместо вызываемой через Declare — однозначно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: GetLastError в VB?

Сообщение Antonariy » 27.01.2010 (Ср) 11:51

А если описанной в tlb?
Лучший способ понять что-то самому — объяснить это другому.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: GetLastError в VB?

Сообщение 0xy » 29.01.2010 (Пт) 3:11

Хакер писал(а):Вместо вызываемой через Declare — однозначно.

А можно поведать о других способах вызова API? В частности, существует ли возможность заставить компиль VB включить dll в импорт проги?

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

Re: GetLastError в VB?

Сообщение Хакер » 29.01.2010 (Пт) 4:46

Да, такой способ существует, иначе как по-твоему осуществляется вызов MsgBox и тому подобных функций?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: GetLastError в VB?

Сообщение 0xy » 29.01.2010 (Пт) 16:15

?? Что-то я не понял намека. Разве трудно вызвать MessageBox через Declare? :D
A вот прог на VB, у которых в импорте есть что-то, кроме MSVBVM, мне встречать не доводилось. По-сему любопытно: можно ли такое скомпилить?

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

Re: GetLastError в VB?

Сообщение Хакер » 29.01.2010 (Пт) 16:49

Ещё раз: Обычная встроенная MsgBox это не более чем импорт rtcMsgBox из msvbvm60.dll. Импорт из msvbvm60 в большинстве с своём это не какой-то «блатной» механизм, доступный только компилятору, это обычный стандартный для VB COM-совместимый механизм импорта.

Функция объявляется в TLB, TLB подключается к проекты. После компиляции такой импорт попадает в нормальную таблицу импорта. При этом, такие импорт обрабатываются абсолютно наравне с функциями вроде MsgBox.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Сообщение 0xy » 29.01.2010 (Пт) 18:20

Ксли я правильно понял, функции, "объявленные в TLB", после компИляции должны оказаться в импорте скомпилированного exe?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re:

Сообщение alibek » 29.01.2010 (Пт) 23:18

0xy писал(а):Ксли я правильно понял, функции, "объявленные в TLB", после компИляции должны оказаться в импорте скомпилированного exe?

Хакер это повторял уже столько раз, что нужно изрядно постараться, чтобы пропустить.
Lasciate ogni speranza, voi ch'entrate.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: GetLastError в VB?

Сообщение 0xy » 30.01.2010 (Сб) 13:18

Хорошо. Тогда расскажите, что за зверь этот TLB, и как его добавить в проект?

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

Re: GetLastError в VB?

Сообщение Хакер » 30.01.2010 (Сб) 13:23

TLB это сокращение от Type Library. Дословно — библиотека типов. Фактически — набор типоописаний. Под типоописанием понимается либо описание псевдонима типа, либо описания типа-структуры (UDT), либо описание энума, либо описание кокласса, либо описание интерфейса, либо описание «плоского» модуля с функциями.

Файлы обычно имеют расширение .tlb или .olb, а ещё чаще лежат внутри PE-файлов — в ресурсах.

Подключается, как ни странно, через Project→References — диалог, в котором выбираются ссылки на зарегистрированные в системе TLB-шки (а не библиотеки, как думают заблуждающиеся).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Сообщение 0xy » 30.01.2010 (Сб) 14:01

А как самому создать простейший tlb (декларирующий одну функцию?)

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

Re: GetLastError в VB?

Сообщение Хакер » 30.01.2010 (Сб) 14:04

Скомпилировать IDL-код MIDL-ом или mktyplib-ом. Сто раз уже об этом писалось.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: GetLastError в VB?

Сообщение 0xy » 30.01.2010 (Сб) 15:03

Может оно где-то и писалось, но лично я все три слова слышу впервые.
По-сему просьба объяснить "на пальцах", а лучше выложить готовый простейший tlb, декларирующий, к примеру, GetProcAddress (мне привычнее ковырять снизу).

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

Re: GetLastError в VB?

Сообщение Хакер » 30.01.2010 (Сб) 15:08

Готовый TLB никто точно не будет выкладывать ради примера. Готовый TLB ради примера уже есть у тебя и лежит в msvbvm60 и имеет (для примера) импорт MsgBox.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: GetLastError в VB?

Сообщение 0xy » 30.01.2010 (Сб) 16:06

Typelib.1 и Typelib.3 в ресурсах?

PS
Любопытно: а для чего он там лежит?

FFOX
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.02.2010 (Чт) 12:42

Re: GetLastError в VB?

Сообщение FFOX » 16.02.2010 (Вт) 16:06

0xy писал(а):По-сему просьба объяснить "на пальцах", а лучше выложить готовый простейший tlb, декларирующий, к примеру, GetProcAddress (мне привычнее ковырять снизу).

У тебя на компьютере :
Program Files\Microsoft Visual Studio\VC98\Include
файлики с расширением Idl
(это не откомпилированные tlb, исходники так сказать)
кроме того есть такая программка OleView.exe
(в тулсах студии)
она может показать этот исходный IDL из tlb
найдешь там много чего интересного.

FFOX
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.02.2010 (Чт) 12:42

Re: GetLastError в VB?

Сообщение FFOX » 16.02.2010 (Вт) 16:13

0xy писал(а):PS
Любопытно: а для чего он там лежит?

Извини, а ты знаком с такими понятиями как COM? Интерфейс? GUID? бинарная совместимость?
Просто без знания этой кухни объяснять на пальцах бесполезно.


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 17

    TopList