2009-03-11 2 views
2

Это фрагмент кода.Как получить строку из вывода ReadProcessMemory

Declare Function ReadProcessMemory Lib "kernel32" _ 
           (ByVal hProcess As Long, _ 
           ByVal lpBaseAddress As Long, _ 
           lpBuffer As Any, _ 
           ByVal nSize As Long, _ 
           lpNumberOfBytesRead As Long) As Long 

Dim bytearray As String * 65526 
Dim GetWindowsFormsID 

ReadProcessMemory(processHandle, bufferMem, ByVal bytearray, size, lp) 
GetWindowsFormsID = ByteArrayToString(bytearray, retLength) 

Function ByteArrayToString(bytes As String, length As Long) As String 
    Dim retValStr As String 
    Dim l As Long 
    retValStr = String$(length + 1, Chr(0)) 
    l = WideCharToMultiByte(CP_ACP, 0, bytes, -1, retValStr, length + 1, Null, Null) 
    ByteArrayToString = retValStr 
End Function 

У меня ошибка '94 null 'при вызове WideCharToMultiByte. Но я уверен, что байты не пустые.

alt text

Это точная процедура, чтобы преобразовать этот вывод в String?

ответ

1

ОК, это решено (а также this question). Эта проблема фактически конвертирует строку WideChar в строку ANSI. Я использую CopyMemory вместо WideCharToMultiByte.

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 

Function ByteArrayToString(bytes As String, Length As Long) As String 
    Dim retValStr As String 
    retValStr = String(Length - 1, Chr$(0)) 
    CopyMemory ByVal StrPtr(retValStr), ByVal bytes, Length * 2 
    ByteArrayToString = retValStr 
End Function 
Смежные вопросы