Страница: 1 |
Страница: 1 |
Вопрос: Type Library и ByRef
Добавлено: 13.11.05 16:43
Автор вопроса: Yurio
Импортируемая API-функция описана в Type Library. Как передать в эту функцию параметр по ссылке?
Вот, например, описание ReadProcessMemory (3-й параметр НЕ должен передаваться по значению):
[entry("ReadProcessMemory")]
LONG ReadProcessMemory(
[in] LONG hProcess,
[in] LONG lpBaseAddress,
[in] BYTE lpBuffer,
[in] LONG nSize,
[in] LONG lpNumberOfBytesWritten);
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #1
Добавлено: 13.11.05 18:46
Ну при обращении и указывай...
CALL ReadProcessMemory (BYVAL/BYREF Parametr1, BYVAL/BYREF Parametr2...)
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 13.11.05 18:51
зачем использовать tlb-шки для стандартных функций?
Возьми да объяви ее сам...
ЗЫ
VarPtr, ObjPtr, StrPtr тебе в помощь...
Номер ответа: 3
Автор ответа:
Yurio
Вопросов: 2
Ответов: 31
Профиль | | #3
Добавлено: 13.11.05 23:50
1.Можно указывать тип их аргументов не только LPSTR (ansi-строка), но и LPWSTR (wide-строка), что позволяет легко использовать unicode-функции, оканчивающиеся буквой W.
2.При вызове импортированных таким образом функций не производится обращение к объекту Err, в то время как при обычном описании функции после ее вызова всегда заполняется свойство Err.LastDllError. Поэтому такое импортирование функций используется при написания многопоточного приложения.
VarPtr не помогает, сам пробовал...
Номер ответа: 4
Автор ответа:
Yurio
Вопросов: 2
Ответов: 31
Профиль | | #4
Добавлено: 13.11.05 23:54
Да уж, АПИ-вьювером пользоваться умеешь...
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 14.11.05 00:52
Значит неверно пробовал
Номер ответа: 6
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #6
Добавлено: 14.11.05 01:09
Ты лучше покажи как ты используешь эту функцию.
При передаче байтового массива, насколько я помню надо передавать по значению адрес первого элемента массива. Т.е. если в объяве стоит ByVal, то VarPtr(buf(0)), а если Byref, то просто buf(0).
Кроме того, если в качестве буфера используешь строку, то это гимор номер два - там надо ромадить хрень типа ByVal StrPtr(strbuf) - короче всё очень странно, поэтому я всегда использую массив.
Номер ответа: 7
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #7
Добавлено: 14.11.05 08:57
всёравно непойму какие проблемы с использованием этой ф-ции? В инете полно примеров, и всё у всех работает...
Dim bi As Byte
Dim sTemp As String * 1
Dim nValue As Long
For bi = 0 To nSize - 1
ReadProcessMemory pHandle, lpBaseAdress + bi, sTemp, 1, 0&
If bi > 0 Then
nValue = nValue + Asc(sTemp) * 16 ^ (bi + 1)
Else
nValue = Asc(sTemp)
End If
Next bi
GetValue = nValue
End Function
Номер ответа: 8
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #8
Добавлено: 14.11.05 09:06
м... пардон, есть лучше вроде...
Dim bi As Byte
Dim sTemp As String * 1
Dim sValue As String
Dim lValue As Long
For bi = 0 To bSize - 1
ReadProcessMemory pHandle, lpBaseAdress + bSize - bi - 1, sTemp, 1, 0&
If bi > 0 Then
sValue = sValue + Hex(Asc(sTemp))
Else
sValue = Hex(Asc(sTemp))
End If
Next bi
GetValue = Val("&H" + sValue)
End Function
Номер ответа: 9
Автор ответа:
Yurio
Вопросов: 2
Ответов: 31
Профиль | | #9
Добавлено: 14.11.05 11:14
to Neco
ПО ССЫЛКЕ
В байтовый массив из 6 элементов я хочу считать первые 6 байт некоторой API-функции:
ReadProcessMemory(GetCurrentProcess(), adrMessageBoxA, buf(0), 6&, 0&
Если в модуле объявить
До того, как открыть тему, перепробовал все варианты с VarPtr/VarPtrArray - 0.
to sne
Почему сразу
Ты сам через VarPtr пробовал-то?
Будет что-то конструктивное - пиши.
to HACKER
Признайся честно, ты о Type Library слышал что-нибудь?
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 14.11.05 19:02
та я то слышал я думал что у тебя вообще в принципе неполучается в ReadProcessMemory параметры передать, а если только в tlb тогда сорри, я не в курсе...
Номер ответа: 11
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #11
Добавлено: 14.11.05 19:02
та я то слышал я думал что у тебя вообще в принципе неполучается в ReadProcessMemory параметры передать, а если только в tlb тогда сорри, я не в курсе...
Номер ответа: 12
Автор ответа:
Yurio
Вопросов: 2
Ответов: 31
Профиль | | #12
Добавлено: 14.11.05 20:57
Вопрос решен:
вместо
надо
Ключевой элемент здесь - это *
Номер ответа: 13
Автор ответа:
Yurio
Вопросов: 2
Ответов: 31
Профиль | | #13
Добавлено: 14.11.05 21:49
Тьфу, перепутал. Надо так: