Страница: 1 | 2 | 3 | 4 | 5 |
Вопрос: Адрес функции
Добавлено: 14.11.05 21:29
Автор вопроса: Yurio
Ответы
Всего ответов: 73
Номер ответа: 46
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #46
Добавлено: 16.11.05 17:19
Просто выражаться надо яснее - а то только на третьей странице становится доступен смысл вопроса.
Мотивировал бы сразу - не гоняли бы траффик на флуд
Номер ответа: 47
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #47
Добавлено: 16.11.05 17:20
О-па, а вот и четвертая... )
Номер ответа: 48
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #48
Добавлено: 16.11.05 17:22
Нет, GSerg не то чтобы перепутал, а как бы это сказать...
Вместо того, чтобы спросить, как выполнить конечную задачу, ты спросил, как сделать некий промежуточный шаг, который, по твоему мнению, является обязательным.
В то время как он обязательным не является, а даже наоборот, довольно вреден, поскольку переводить всякую фигню в массив байт довольно глупо, поскольку что угодно является массивом байт на самом деле.
Это уже сразу настораживает и заставляет делать вывод о неверности подхода в целом.
Если бы в декларации своей tlb ты написал не BYTE*, а void*, эту тему тебе открывать бы не пришлось...
Номер ответа: 49
Автор ответа:
Yurio
Вопросов: 2
Ответов: 31
Профиль | | #49
Добавлено: 16.11.05 17:24
adr = GetProcAddress(GetModuleHandle("user32.dll", "MessageBoxA"
Как получить адрес этой же функции в виде 4 переменных типа Byte ?
Ну и что именно здесь было непонятно?
Главное, что почти весь флуд был посвящен указателям -
Номер ответа: 50
Автор ответа:
Yurio
Вопросов: 2
Ответов: 31
Профиль | | #50
Добавлено: 16.11.05 17:37
1. 90% я мог сделать и сам, не обращаясь на форум.
2. Предположим, что ты знаешь, как это реализовать от и до. А со мной ты поделился бы своими знаниями? И сколько бы понадобилось постов, каков бы был их размер?
Номер ответа: 51
Автор ответа:
Yurio
Вопросов: 2
Ответов: 31
Профиль | | #51
Добавлено: 16.11.05 18:50
Насчет перевода адреса (разобрался, как и обещал ).
Вот это тоже работает:
WriteProcessMemoryL cProc, aMSGBA, &H68, 1&, 0&
WriteProcessMemoryL cProc, aMSGBA + 1, x, 4&, 0&
WriteProcessMemoryL cProc, aMSGBA + 5, &HC3, 1&, 0&
Но теперь приходится WriteProcessMemory объявлять 2 раза, т.к. для записи оригинальных 6 байт на место надо
Номер ответа: 52
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #52
Добавлено: 17.11.05 08:27
Yurio,
воистину ты неисправим. Тебе же сказали что ЛЮБОЙ тип данных, каким бы сложным он не был, в конечном итоге является последовательностью байт по какому то адресу. На основании этого и нужно строить логику, а не искать разницу между байтом и двойным словом и подгонять API-функции под эту ересь.
Номер ответа: 53
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #53
Добавлено: 17.11.05 08:37
Это тебя смущает?
Ну так он требует адрес, а для получения адреса в VB есть функция VarPtr. Например VarPtr(oldData(0)) вернёт адрес начала байтового массива.
Номер ответа: 54
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #54
Добавлено: 17.11.05 11:50
Ответ на этот вопрос тебе дали на первой странице. На встречный вопрос - зачем нужна эта ересь - ты ответить отказался. Кстати, до сих пор.
Поскольку для изложенной тобой задачи эта чушь совершенно не нужная.
Тут вопрос не в том КАК - можно хоть побитово или октетами, повторяюсь: вопрос был - ЗАЧЕМ???
Номер ответа: 55
Автор ответа:
Yurio
Вопросов: 2
Ответов: 31
Профиль | | #55
Добавлено: 17.11.05 21:21
CyRax
А ты часом не забыл подсказать, что VarPtr(oldData(0)) нужно передавать не по ссылке, а по значению?
И что третий параметр в этом случае следует описывать не как LONG*, а как LONG (если оставить LONG*, то при компиляции ругань
на ByVal VarPtr(oldData(0)), - в отличие от описания функции в модуле, когда можно написать сначала ByRef, а потом вызвать с
ByVal). И тогда VarPtr(&H68) и VarPtr(&HC3) выглядят просто замечательно...
Намного лучше самого первого варианта?
А если пытаться делать через структуру jmp_far (как в указанной статье на RSDN), то и с VarPtr не работает. Почему?
Номер ответа: 56
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #56
Добавлено: 17.11.05 22:43
Yurio,
мне кажется что много ума не нужно чтобы понять что ByRef это тоже самое что и ByVal VarPtr. Для этого просто не нужно программировать на Си в VB IDE. Хочешь программировать на Си - используй MS VC, а в MS VB ты можешь программировать только на Бейсике (это по поводу твоих "не как LONG*, а как LONG"
Я вообше не знаю с какого бодуна могла прийти в голову мысль передавать функции значение если она требует указатель (АДРЕС). Туда нужно передавать адрес. Программистами Майкрософт функция WriteProcessMemory устроена так, что третий параметр (LPVOID lpBuffer) автомат функции воспринимает как адрес, с которого начинается обрабатываемый массив байт.
ByVal hProcess As Long, _
ByRef lpBaseAddress As Any, _
ByRef lpBuffer As Any, _
ByVal nSize As Long, _
ByRef lpNumberOfBytesWritten As Long) As Long
Между прочим это объявление ты должен предоставлять, а не я за тебя. Ты хочешь узнать информацию, отрываешь людей от дела, а предоставить всю необходимую информацию тебе наверное просто лень? Пусть они сами додумываются до моих гениальных мыслей.
Номер ответа: 57
Автор ответа:
Yurio
Вопросов: 2
Ответов: 31
Профиль | | #57
Добавлено: 18.11.05 00:02
Ответ #30
Не понял. Это о
?
В том-то и дело, что функцию я объявляю через библиотеку типов. А VB воспринимает LONG* как передачу ByRef (если попробовать передать в качестве 3-го параметра не Long, то следует "ByRef argument type mismatch", а LONG (и любой другой тип без "*" - как ByVal (можно добиться такого : "User-defined type may not be passed ByVal". Ошибки - лишь для иллюстрации.
Что именно предоставить? Скажи, я предоставлю.
А что все-таки насчет jmp_far и VarPtr?
Но вообще-то критике (если это можно назвать критикой) подвергается преобразование адреса функции. Когда я пишу oldData(0) (без VarPtr), то ведь тоже передается АДРЕС
Так какая разница, если работают различные варианты?
Номер ответа: 58
Автор ответа:
Yurio
Вопросов: 2
Ответов: 31
Профиль | | #58
Добавлено: 18.11.05 00:13
Слегка описАлся
Читать
"Когда я пишу newData(0)"
Преобразованный адрес записывается в newData(1) ... newData(4)
Номер ответа: 59
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #59
Добавлено: 18.11.05 01:02
Ладно, твоё словоблудие меня уже достало. Хочешь передавать только адрес, замени в объявлении.
ByRef lpBaseAddress As Any
на
ByVal lpBaseAddress As Long
Тогда сможешь передавать хоть адрес массива, хоть адрес числа.
Хочется работать по ссылке?
Вот смотри, я передаю в библиотеку на PB что байтовый массив что число (заметь по ссылке).
PB/WIN:
'и другая декларативная мутотень
Sub Test1 Alias "Test1"Value As Asciiz, ByVal LngOrStr As Byte) Export
Select Case LngOrStr
Case 1 'Lng
Dim lPtr As Long Ptr
lPtr=VarPtr(Value)
MsgBox Str$(@lPtr)
Case 2 'Str
MsgBox Left$(Value,6)
End Select
End Sub
VB6:
Private Sub Form_Load()
Dim a() As Byte, b As Long
b = 12345678
Test1 b, 1
ReDim a(5)
a(0) = 48: a(1) = 49: a(2) = 50: a(3) = 51: a(4) = 52: a(5) = 53
Test1 a(0), 2
End Sub
Тут вообще всем по барабану что и как передавать и принимать. Главное как данные интерпретировать. "a" - это массив из 6 байт, а "b" - массив из 4-х байт. Главное передать адрес, а функция сама разберётся что с ним делать. Всё, утомил своим невежеством
Номер ответа: 60
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #60
Добавлено: 18.11.05 12:29
* = ByRef, Long* = ByRef LongVar as Long = ByVal VarPtr(LongVar& )
Мда, хотелось бы посмотреть как ты бы описывал "**" ))