Вызов API без объявления

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Вызов API без объявления

Сообщение Kovu » 09.06.2005 (Чт) 14:56

есть такой код
Код: Выделить всё
Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Sub Command1_Click()
 

    lb = LoadLibrary("user32")

    pa = GetProcAddress(lb, "SetWindowTextA")

    CallWindowProc pa, Me.hWnd, "Privet!", ByVal 0&, ByVal 0&

   FreeLibrary lb
End Sub

Почему привыполнении на XP SP2 программа вылетает с ошибкой, хотя отлично видно, что API сделала своё дело :D :?:
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение tyomitch » 09.06.2005 (Чт) 15:07

Потому что у SetWindowText два параметра, а ты передаёшь четыре.
Изображение

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 09.06.2005 (Чт) 15:14

tyomitch
Ну и как их не передавать? :)
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение tyomitch » 09.06.2005 (Чт) 15:40

Строить в памяти переходник.
Или взять готовый код Оловянникова и не мучаться. Ссылки позавчера давал.
Изображение

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 10.06.2005 (Пт) 1:06

Почитай
http://vbstreets.ru/VB/Articles/66035.aspx

Но лично мое мнение, ты что-то с объявлением напутал либо ByVal не там либо Long вместо Any, поидее должно работать

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

Сообщение tyomitch » 10.06.2005 (Пт) 10:45

ism писал(а):Но лично мое мнение, ты что-то с объявлением напутал либо ByVal не там либо Long вместо Any, поидее должно работать

Да и не должно!! :twisted:
Изображение

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 11.06.2005 (Сб) 18:30

C GetWindowTextLength раборает, личено видел, а унего всего 1 параметр. Но даже если из-за к-ва параметров, то функция выполняется до возникновения ошибки. Значит скорее всего это из-зи стэка, а следовательно можно и избежать этого через вставку на АСМе, благо это на ВБ делается легко.

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

Сообщение tyomitch » 11.06.2005 (Сб) 19:17

ism писал(а):C GetWindowTextLength раборает, личено видел, а унего всего 1 параметр. Но даже если из-за к-ва параметров, то функция выполняется до возникновения ошибки. Значит скорее всего это из-зи стэка, а следовательно можно и избежать этого через вставку на АСМе, благо это на ВБ делается легко.

"Из-за стека" - это и есть "из-за количества параметров", разве не так?
Про "вставку на АСМе" я уже сказал, и даже сослал на код Оловянникова - там именно так.
Изображение


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

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

Сейчас этот форум просматривают: Google-бот и гости: 186

    TopList