Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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
Адрес функции в переменную типа Long можно получить так:

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 байт на место надо

WriteProcessMemoryB cProc, aMSGBA, oldData(0), 6&, 0&

Ответить

Номер ответа: 52
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #52
Добавлено: 17.11.05 08:27
Yurio,
 воистину ты неисправим. Тебе же сказали что ЛЮБОЙ тип данных, каким бы сложным он не был, в конечном итоге является последовательностью байт по какому то адресу. На основании этого и нужно строить логику, а не искать разницу между байтом и двойным словом и подгонять API-функции под эту ересь.

Ответить

Номер ответа: 53
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #53
Добавлено: 17.11.05 08:37
Это тебя смущает?
LPVOID lpBuffer, // pointer to buffer to write data to

 Ну так он требует адрес, а для получения адреса в 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-сайт: basicproduction.nm.ru
 Профиль | | #56
Добавлено: 17.11.05 22:43
Yurio,
 мне кажется что много ума не нужно чтобы понять что ByRef это тоже самое что и ByVal VarPtr. Для этого просто не нужно программировать на Си в VB IDE. Хочешь программировать на Си - используй MS VC, а в MS VB ты можешь программировать только на Бейсике (это по поводу твоих "не как LONG*, а как LONG";)
И тогда VarPtr(&H68) и VarPtr(&HC3) выглядят просто замечательно...

 Я вообше не знаю с какого бодуна могла прийти в голову мысль передавать функции значение если она требует указатель (АДРЕС). Туда нужно передавать адрес. Программистами Майкрософт функция WriteProcessMemory устроена так, что третий параметр (LPVOID lpBuffer) автомат функции воспринимает как адрес, с которого начинается обрабатываемый массив байт.
Private Declare Function WriteProcessMemory Lib "kernel32.dll" ( _
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 :-)


передавать функции значение если она требует указатель


Не понял. Это о

написать сначала ByRef, а потом вызвать с ByVal


?


в MS VB ты можешь программировать только на Бейсике


В том-то и дело, что функцию я объявляю через библиотеку типов. А 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
Слегка описАлся

Когда я пишу oldData(0)


Читать

"Когда я пишу newData(0)"

Преобразованный адрес записывается в newData(1) ... newData(4)

Ответить

Номер ответа: 59
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #59
Добавлено: 18.11.05 01:02
Ладно, твоё словоблудие меня уже достало. Хочешь передавать только адрес, замени в объявлении.
ByRef lpBaseAddress As Any
на
ByVal lpBaseAddress As Long
Тогда сможешь передавать хоть адрес массива, хоть адрес числа.

Хочется работать по ссылке?
Вот смотри, я передаю в библиотеку на PB что байтовый массив что число (заметь по ссылке).

PB/WIN:
#Compile Dll "tst1.dll"
'и другая декларативная мутотень
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 Declare Sub Test1 Lib "tst1.dll" (Value As Any, ByVal LngOrStr As Byte)

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
В том-то и дело, что функцию я объявляю через библиотеку типов. А VB воспринимает LONG* как передачу ByRef (если попробовать передать в качестве 3-го параметра не Long, то следует "ByRef argument type mismatch";)

* = ByRef, Long* = ByRef LongVar as Long = ByVal VarPtr(LongVar&;) :))
а LONG (и любой другой тип без "*";) - как ByVal

Мда, хотелось бы посмотреть как ты бы описывал "**" :)))

Ответить

Страница: 1 | 2 | 3 | 4 | 5 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам