Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 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
Public Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long



Ну при обращении и указывай...
CALL ReadProcessMemory (BYVAL/BYREF Parametr1, BYVAL/BYREF Parametr2...)

Ответить

Номер ответа: 2
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #2
Добавлено: 13.11.05 18:51
зачем использовать tlb-шки для стандартных функций?

Возьми да объяви ее сам...

ЗЫ
VarPtr, ObjPtr, StrPtr тебе в помощь...

Ответить

Номер ответа: 3
Автор ответа:
 Yurio



Вопросов: 2
Ответов: 31
 Профиль | | #3 Добавлено: 13.11.05 23:50
зачем использовать tlb-шки для стандартных функций?]


Описание импортируемых функций в Type Library дает следующие преимущества:
1.Можно указывать тип их аргументов не только LPSTR (ansi-строка), но и LPWSTR (wide-строка), что позволяет легко использовать unicode-функции, оканчивающиеся буквой W.
2.При вызове импортированных таким образом функций не производится обращение к объекту Err, в то время как при обычном описании функции после ее вызова всегда заполняется свойство Err.LastDllError. Поэтому такое импортирование функций используется при написания многопоточного приложения.


VarPtr не помогает, сам пробовал...

Ответить

Номер ответа: 4
Автор ответа:
 Yurio



Вопросов: 2
Ответов: 31
 Профиль | | #4 Добавлено: 13.11.05 23:54
Public Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long


Да уж, АПИ-вьювером пользоваться умеешь...

Ответить

Номер ответа: 5
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 14.11.05 00:52
Значит неверно пробовал ;)

Ответить

Номер ответа: 6
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #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
всёравно непойму какие проблемы с использованием этой ф-ции? В инете полно примеров, и всё у всех работает...

Function GetValue(pHandle As Long, lpBaseAdress As Long, nSize As Byte) As Long
    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
м... пардон, есть лучше вроде...

Function GetValue(pHandle As Long, lpBaseAdress As Long, bSize As Byte) As Long
    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-функции:

adrMessageBoxA = GetProcAddress(GetModuleHandle("user32.dll";), "MessageBoxA";)

ReadProcessMemory(GetCurrentProcess(), adrMessageBoxA, buf(0), 6&, 0&;)


Если в модуле объявить
ByRef lpBuffer as Byte
, то всё работает, если через *.tlb - нет.

До того, как открыть тему, перепробовал все варианты с 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
Вопрос решен:

вместо

[in] BYTE lpBuffer


надо

[out, retval] BYTE* lpBuffer


Ключевой элемент здесь - это *

Ответить

Номер ответа: 13
Автор ответа:
 Yurio



Вопросов: 2
Ответов: 31
 Профиль | | #13 Добавлено: 14.11.05 21:49
Тьфу, перепутал. Надо так:

[in, out] BYTE* lpBuffer

Ответить

Страница: 1 |

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



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