Консультация № 29822
19.11.2005, 20:01
0.00 руб.
0 4 1
Здраствуйте! Спасибо за столь быстрый ответ на вопрос 29807. Мне действительно надо его уточнить. Я хочу динамически загружать любую API-функцию, независимо объявленна ли она в WinProc. Информация, которую я нашел, обрывочна. Программка в приложении выдает ошибку: Runtime error 216 at 0001:004A. Компилировал и под виндоус, и в защищенном режиме. WinXP без SP, BP 7.0.
Может быть я вообще все неправиль делаю?

Приложение:
{$N+,E+}uses WinApi;type t = ^longint; TFunc = function (a:t;b:longint):boolean;var c:t; hLib:word; InternetGetConnectedState:TFunc;begin hLib:=loadlibrary(‘wininet.dll‘); @InternetGetConnectedState := getprocaddress(hLib,‘InternetGetConnectedStateA‘); if not InternetGetConnectedState(c,0) then writeln(‘adsfd‘);end.

Обсуждение

давно
Мастер-Эксперт
425
4118
20.11.2005, 08:11
общий
это ответ
Здравствуйте, NLeo!
В приложении я Вам привел несколько переделаную Вашу программу, чтобы Вы сразу поняли, где у Вас затык. Со своей стороны хочу сказать, что проверки на правильность занрузки модулей и получения адресов нужно ставить В ОБЯЗАТЕЛЬНОМ ПРЯДКЕ.
В чем проблема я сказать не могу, скорее всего в том что у Вас ВР 16-ти разрядный, а сама функция 32-ух разрядная.
Еще один нюанс. Вы описали прототип функции InternetGetConnectedState с тремя параметрами, а у нее всего два параметра, типы которых отличаются от LongWord. Первый параметр - указатель на DWORD, а второй - собственно DWORD. LongInt от DWORD отличается наличием знака и наибольшее значение его в два раза меньше чем у DWORD. Ну а с указателем, я думаю, Вам объяснять не надо в чем разница.
----------------------------
Немного не в тему, но у меня вопрос - а Вы, случаем, не мазохист? :)
Я когда поставил себе BPW, чтобы проверить Вашу программу, у меня такой тормозун в системе начался, что я по три раза выспаться успевал, пока получал какой-то результат, например банальная смена каталога в проводнике.
Поставьте себе FreePascal. Это аналог BorlandPascal, только написан специально с учетом 32-х разрядных систем и работает под виндой без сучка и задоринки. По крайней мере у меня сильных претензий к нему нет. Сайт программы:
www.freepascal.org
Для программирования под винду (как в Вашем случае) Вам надо скачать IDE для винды, чтобы не было проблем с русскими кодировками. Вот сайт где она лежит:
www.bloodshed.net/devpascal.html

Приложение:
Program test1;Uses WinAPI;Const HINSTANCE_ERROR = 32;type t = ^longint; TFunc = function (a:t;b:longint):boolean; stdcall;var c:t; hLib:THandle; InternetGetConnectedState:TFunc;begin hLib:=loadlibrary(‘wininet.dll‘); if hLib > HINSTANCE_ERROR Then MessageBox(0, ‘Ошибка загрузки библиотеки‘,‘Внимание‘, mb_ok) Else Begin @InternetGetConnectedState := getprocaddress(hLib,‘InternetGetConnectedState‘); if @InternetGetConnectedState = NIL then MessageBox(0,‘Адрес функции не получен‘, ‘Внимание‘, mb_ok) Else Begin MessageBox(0, ‘Все пучком‘, ‘Ура!!!‘, mb_ok); FreeLibrary(hLib); End; End;end.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
20.11.2005, 08:15
общий
Прошу прощения, не сразу разглядел, что в Вашем прототипе не три параметра, а два. :)Но тем не менее всегда есть вероятность, что всамделешные значения выйдут за диапазон LongInt.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
20.11.2005, 21:12
общий
Нее я не мазохист. Когда мне сказали о вызовах апи в Паскале, я сильно удивился и захотел попробовать. Сейчас повторил это в Делфе все заработало, а в Паскале я себя просто уверенней чувствую. Кстати, там тип хэндла библиотеки гораздо больше WORD. И спасибо за ответ.
давно
Мастер-Эксперт
425
4118
21.11.2005, 06:15
общий
Тогда искренне рад за Вас. :)Тип там действительно не совсем WORD. Просто в WinAPI.pas тип THandle (который используется для обращения к файлам и прочим устройствам) приравнен к типу WORD, т.к. нужен был наибольший тип бе отрицательных значений. Однако лучше все же использовать THandle для того чтобы была более строгая типизация.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Форма ответа