Строка на выполнении

Программирование на 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
Пользователь #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
Пользователь #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
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.12.2004 (Чт) 8:20

ANDLL писал(а):Не работает...
А, дак у тебя ещё и CALL далёкий :roll:
И ещё ты не адрес копировал в VarPtr(nBytes(0)) + 1, а первый DWORD своей функции :-D
Делай так:
Код: Выделить всё
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
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.12.2004 (Чт) 8:21

ANDLL писал(а):Кстати, tyomitch, stdcall-функция не знает наверняка сколько параметров ей передается и очищать стек - не ее забота. Или нет?

Наоборот, это cdecl не знает. А stdcall как раз знает, и сама чистит.
Изображение


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

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

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

    TopList  
cron