Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут
закрыты.
Читайте
требования к создаваемым темам.
-
ANDLL
-
- Великий гастроном

-

-
- Сообщения: 3450
- Зарегистрирован: 29.06.2003 (Вс) 18:55
-
ANDLL » 15.12.2004 (Ср) 21:32
Что не так в этом коде?
- Код: Выделить всё
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Sub SomeFunc()
Beep
End Sub
Public Sub Main()
Dim nBytes(5) As Byte
nBytes(0) = &H9A 'call
CopyMemory VarPtr(nBytes(0)) + 1, AddressOf SomeFunc, 4
nBytes(5) = &HC3 'ret
Call CallWindowProc(VarPtr(nBytes(0)), 0, 0, 0, 0)
Stop
End Sub
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог
-
tyomitch
-
- Пользователь #1352

-

-
- Сообщения: 12822
- Зарегистрирован: 20.10.2002 (Вс) 17:02
- Откуда: חיפה
tyomitch » 16.12.2004 (Чт) 4:35
То, что вместо C3 (ret) надо писать С2 10 00 (ret 10h)
-
ANDLL
-
- Великий гастроном

-

-
- Сообщения: 3450
- Зарегистрирован: 29.06.2003 (Вс) 18:55
-
ANDLL » 16.12.2004 (Чт) 7:32
А можно поинтересоваться, почему именно десять?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог
-
tyomitch
-
- Пользователь #1352

-

-
- Сообщения: 12822
- Зарегистрирован: 20.10.2002 (Вс) 17:02
- Откуда: חיפה
tyomitch » 16.12.2004 (Чт) 7:34
Передаётся четыре параметра, каждый длиной четыре байта. 4 * 4 = 10h
-
ANDLL
-
- Великий гастроном

-

-
- Сообщения: 3450
- Зарегистрирован: 29.06.2003 (Вс) 18:55
-
ANDLL » 16.12.2004 (Чт) 7:53
Не работает...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог
-
ANDLL
-
- Великий гастроном

-

-
- Сообщения: 3450
- Зарегистрирован: 29.06.2003 (Вс) 18:55
-
ANDLL » 16.12.2004 (Чт) 8:10
Кстати, tyomitch, stdcall-функция не знает наверняка сколько параметров ей передается и очищать стек - не ее забота. Или нет?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог
-
tyomitch
-
- Пользователь #1352

-

-
- Сообщения: 12822
- Зарегистрирован: 20.10.2002 (Вс) 17:02
- Откуда: חיפה
tyomitch » 16.12.2004 (Чт) 8:20
ANDLL писал(а):Не работает...
А, дак у тебя ещё и CALL далёкий
И ещё ты не адрес копировал в VarPtr(nBytes(0)) + 1, а первый DWORD своей функции
Делай так:
- Код: Выделить всё
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Sub SomeFunc()
Beep
End Sub
Public Sub Main()
Dim nBytes(13) As Byte
nBytes(0) = &HE8 'call
nBytes(1) = 3
nBytes(5) = &HC2 'ret
nBytes(6) = &H10
nBytes(8) = &H68 'push
CopyMemory nBytes(9), AddressOf SomeFunc, 4
nBytes(13) = &HC3 'ret
Call CallWindowProc(VarPtr(nBytes(0)), 0, 0, 0, 0)
Stop
End Sub
Причём работающий пример всего этого мной уже постился здесь:
http://bbs.vbstreets.ru/viewtopic.php?p=77509#77509
Мог бы и сам сравнить

-
tyomitch
-
- Пользователь #1352

-

-
- Сообщения: 12822
- Зарегистрирован: 20.10.2002 (Вс) 17:02
- Откуда: חיפה
tyomitch » 16.12.2004 (Чт) 8:21
ANDLL писал(а):Кстати, tyomitch, stdcall-функция не знает наверняка сколько параметров ей передается и очищать стек - не ее забота. Или нет?
Наоборот, это cdecl не знает. А stdcall как раз знает, и сама чистит.
Вернуться в Visual Basic 1–6
Кто сейчас на конференции
Сейчас этот форум просматривают: AhrefsBot, Google-бот, SemrushBot, YaCy [Bot] и гости: 24