' функция из библиотеки 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)
Указатели в Visual Basic
Проблема в следующем. В 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
Здесь последний параметр - как раз адрес процедуры. В моей библиотеке есть нечто подобное. Так как же получить этот адрес?
В случае с функцией SetTimer можно использовать оператор AddressOf. Возможно он будет Вам полезен и при работе с Вашей процедурой.
Цитата: Ден Зурин
Вообще-то мне не нравится этот язык
Тогда почему используете?
Цитата: SkyM@n
Тогда почему используете?
Я же объяснил.
Цитата: Ден Зурин
пишу библиотеку, и хотелось бы, чтобы ее можно было использовать в различных средах, как-то Delphi, Visual C++, Visual Basic etc.
ИМХО, Бейсик изначально создавался для любительского программирования, а не для профессионального. Поэтому сама идея VB нарушает философию Бейсика. Но вернемся к теме.
Значит, нужно использовать AddressOf. Для простоты считаем, что вызываемая подпрограмма не имеет параметров и не возвращает значения. У меня получился такой пример:
Код:
Осталось выяснить только один вопрос. Какое соглашение по вызову использует вызываемая процедура, в данном случае MyHandler? Т.е. stdcall, cdecl или pascal? Ведь нужно знать, как описывать этот параметр в библиотеке. У меня описан как cdecl.
Цитата: Ден Зурин
...Осталось выяснить только один вопрос. Какое соглашение по вызову использует вызываемая процедура, в данном случае MyHandler? Т.е. stdcall, cdecl или pascal? Ведь нужно знать, как описывать этот параметр в библиотеке. У меня описан как cdecl.
__stdcall:
http://support.microsoft.com/kb/153586
Цитата:
Вообще-то мне не нравится этот язык, просто сейчас пишу библиотеку, и хотелось бы, чтобы ее можно было использовать в различных средах, как-то Delphi, Visual C++, Visual Basic etc.
Вообще-то такую же библиотеку можно написать на C++ или Delphi. ;)