Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Указатели в Visual Basic

30K
17 февраля 2008 года
Ден Зурин
28 / / 17.02.2008
Вообще-то мне не нравится этот язык, просто сейчас пишу библиотеку, и хотелось бы, чтобы ее можно было использовать в различных средах, как-то Delphi, Visual C++, Visual Basic etc.
Проблема в следующем. В Visual Basic можно получить адрес переменной с помощью функции VarPtr и, таким образом, работать с указателями на переменные. А вот как быть с указателями на процедуры и функции?
Вот, например, объявление Win32 API-функции SetTimer:
Declare Function SetTimer Lib "user32" Alias "SetTimer" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Здесь последний параметр - как раз адрес процедуры. В моей библиотеке есть нечто подобное. Так как же получить этот адрес?
275
17 февраля 2008 года
pashulka
985 / / 19.09.2004
В случае с функцией SetTimer можно использовать оператор AddressOf. Возможно он будет Вам полезен и при работе с Вашей процедурой.
251
17 февраля 2008 года
SkyMаn
1.7K / / 31.07.2007
Цитата: Ден Зурин
Вообще-то мне не нравится этот язык


Тогда почему используете?

30K
18 февраля 2008 года
Ден Зурин
28 / / 17.02.2008
Цитата: SkyM@n
Тогда почему используете?


Я же объяснил.

Цитата: Ден Зурин
пишу библиотеку, и хотелось бы, чтобы ее можно было использовать в различных средах, как-то Delphi, Visual C++, Visual Basic etc.


ИМХО, Бейсик изначально создавался для любительского программирования, а не для профессионального. Поэтому сама идея VB нарушает философию Бейсика. Но вернемся к теме.
Значит, нужно использовать AddressOf. Для простоты считаем, что вызываемая подпрограмма не имеет параметров и не возвращает значения. У меня получился такой пример:

Код:
'  функция из библиотеки MyLib.dll
Declare Function Sub SetHighTimer Lib "MyLib" Alias "SetHighTimer" _
(ByVal nElapse As Long, ByVal pHandler As Long) As Long

Sub MyHandler()
'  код процедуры
End Sub

Dim MyTimer As Long

' ...
' передаем адрес процедуры как параметр
MyTimer = SetHighTimer(40, AddressOf MyHandler)

Осталось выяснить только один вопрос. Какое соглашение по вызову использует вызываемая процедура, в данном случае MyHandler? Т.е. stdcall, cdecl или pascal? Ведь нужно знать, как описывать этот параметр в библиотеке. У меня описан как cdecl.
6.4K
18 февраля 2008 года
Host
122 / / 22.09.2005
Цитата: Ден Зурин
...Осталось выяснить только один вопрос. Какое соглашение по вызову использует вызываемая процедура, в данном случае MyHandler? Т.е. stdcall, cdecl или pascal? Ведь нужно знать, как описывать этот параметр в библиотеке. У меня описан как cdecl.



__stdcall:
http://support.microsoft.com/kb/153586

241
26 февраля 2008 года
Sanila_san
1.6K / / 07.06.2005
Цитата:
Вообще-то мне не нравится этот язык, просто сейчас пишу библиотеку, и хотелось бы, чтобы ее можно было использовать в различных средах, как-то Delphi, Visual C++, Visual Basic etc.

Вообще-то такую же библиотеку можно написать на C++ или Delphi. ;)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог