Свойства ListView чужого приложения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
IvanTheTerrible
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 20.07.2005 (Ср) 11:47
Откуда: Moscow

Свойства ListView чужого приложения

Сообщение IvanTheTerrible » 25.12.2007 (Вт) 16:33

Пытаюсь прочесть значения полей ListView из чужого приложения.

Код: Выделить всё
Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
                                                               
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
        ByVal hWnd1 As Long, _
        ByVal hWnd2 As Long, _
        ByVal lpsz1 As String, _
        ByVal lpsz2 As String) As Long
     
   
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
        ByVal hwnd As Long, _
        ByVal wMsg As Long, _
        ByVal wParam As Long, _
        lParam As Any) As Long

Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
        ByVal hwnd As Long, _
        lpdwProcessId As Long) As Long
       
Private Declare Function OpenProcess Lib "kernel32.dll" ( _
        ByVal dwDesiredAccessas As Long, _
        ByVal bInheritHandle As Long, _
        ByVal dwProcId As Long) As Long
       
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal Handle As Long) As Long
       
Private Declare Function VirtualAllocEx Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpAddress As Any, ByRef dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpAddress As Any, ByRef dwSize As Long, ByVal dwFreeType As Long) As Long

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
       
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long


Private Type POINTAPI
    x As Long
    y As Long
End Type
       
Private Type LVITEM
    mask       As Long
    iItem      As Long
    iSubItem   As Long
    State      As Long
    stateMask  As Long
    pszText    As Long
    cchTextMax As Long
    iImage     As Long
    lParam     As Long
    iIndent    As Long
End Type

Private Const LVFI_PARAM      As Long = &H1
Private Const LVIF_TEXT       As Long = &H1

Private Const LVM_FIRST       As Long = &H1000
Private Const LVM_GETITEMCOUNT As Long = (LVM_FIRST + 4)

Private Const LVM_FINDITEM    As Long = (LVM_FIRST + 13)
Private Const LVM_GETITEMTEXT As Long = (LVM_FIRST + 45)
Private Const LVM_SORTITEMSEX As Long = (LVM_FIRST + 81)

Private Const LVM_SETITEMTEXTA As Long = (LVM_FIRST + 46)

Private Const PROCESS_VM_OPERATION As Long = (&H8)
Private Const PROCESS_VM_WRITE As Long = (&H20)
Private Const PROCESS_VM_READ As Long = (&H10)
Private Const MEM_RELEASE As Long = &H8000
Private Const MEM_COMMIT As Long = &H1000
Private Const PAGE_READWRITE As Long = &H4

Private Sub Command1_Click()
Dim tWindow As Long
Dim hListView As Long
Dim hProcess As Long
Dim pID As Long

Dim LVItemAddr As Long
Dim LVTextBufferAddr As Long
Dim p As LVITEM
Dim lResp As Long
Dim a(256) As Byte

    tWindow = FindWindow(vbNullString, "Test")
    hListView = FindWindowEx(tWindow, 0&, "ListView20WndClass", vbNullString)
   
    GetWindowThreadProcessId hListView, pID
    hProcess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, pID)

    LVItemAddr = VirtualAllocEx(hProcess, ByVal 0&, ByVal Len(p), MEM_COMMIT, PAGE_READWRITE)
    LVTextBufferAddr = VirtualAllocEx(hProcess, ByVal 0&, ByVal 256&, MEM_COMMIT, PAGE_READWRITE)
   
    With p
        .mask = LVIF_TEXT
        .iItem = 1
        .iSubItem = 1
        .cchTextMax = 255
        .pszText = LVTextBufferAddr
    End With
   
    WriteProcessMemory hProcess, LVItemAddr, VarPtr(p), Len(p), 0&

' На следующей строке происходит падение внешнего приложения
    SendMessage hListView, LVM_GETITEMTEXT, 1, p
   
   
    ....   
   
    lResp = rpiVirtualFree(hProcess, LVTextBufferAddr)
    lResp = rpiVirtualFree(hProcess, LVItemAddr)
   
    CloseHandle hProcess
End Sub



Подскажите please, где я ошибаюсь.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 25.12.2007 (Вт) 17:21

Код: Выделить всё
Dim uLVI   As LVITEM_lp
Dim a(261) As Byte
Dim lLen   As Long
        With uLVI
            .pszText = VarPtr(a(0))
            .cchTextMax = UBound(a)
        End With
        lLen = SendMessage(hListView, LVM_GETITEMTEXT, lIndex, uLVI)
        ItemText = Left$(StrConv(a(), vbUnicode), lLen)

И все должно работать без этих ужасов:
Код: Выделить всё
    GetWindowThreadProcessId hListView, pID
    hProcess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, pID)

    LVItemAddr = VirtualAllocEx(hProcess, ByVal 0&, ByVal Len(p), MEM_COMMIT, PAGE_READWRITE)
    LVTextBufferAddr = VirtualAllocEx(hProcess, ByVal 0&, ByVal 256&, MEM_COMMIT, PAGE_READWRITE)
   
    With p
        .mask = LVIF_TEXT
        .iItem = 1
        .iSubItem = 1
        .cchTextMax = 255
        .pszText = LVTextBufferAddr
    End With
   
    WriteProcessMemory hProcess, LVItemAddr, VarPtr(p), Len(p), 0&
Лучший способ понять что-то самому — объяснить это другому.

IvanTheTerrible
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 20.07.2005 (Ср) 11:47
Откуда: Moscow

Сообщение IvanTheTerrible » 25.12.2007 (Вт) 17:32

2 Antonariy:

Вываливается аналогичным образом :(

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 25.12.2007 (Вт) 17:48

Код: Выделить всё
Public Type LVITEM_lp
    mask       As Long
    iItem      As Long
    iSubItem   As Long
    State      As Long
    stateMask  As Long
    pszText    As Long
    cchTextMax As Long
    iImage     As Long
    lParam     As Long
    iIndent    As Long
End Type
Так объявлено?
Лучший способ понять что-то самому — объяснить это другому.

IvanTheTerrible
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 20.07.2005 (Ср) 11:47
Откуда: Moscow

Сообщение IvanTheTerrible » 25.12.2007 (Вт) 17:55

Да

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 25.12.2007 (Вт) 18:08

Тогда больше нет вариантов.
Лучший способ понять что-то самому — объяснить это другому.

IvanTheTerrible
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 20.07.2005 (Ср) 11:47
Откуда: Moscow

Сообщение IvanTheTerrible » 26.12.2007 (Ср) 9:58

Я кажется понял в чем дело...
Код работает, если LV находится в моем приложении и не работает, если в чужом.

Строка

WriteProcessMemory hProcess, LVItemAddr, VarPtr(p), Len(p), 0&

возвращает 0, хотя, при успехе, должно возвращаться не нулевое значение. Похоже, ХР блокирует попытку записи в адресное пространство чужого процесса... Это так?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.12.2007 (Ср) 10:02

Конечно.
Почитай темы про расширение часов в трее.
Либо, если работаешь под админом, подключай привилегию SeDebug.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 26.12.2007 (Ср) 11:28

А почему SendMessage не проходит? Вроде в ней криминала нет...
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.12.2007 (Ср) 11:46

WM_USER и выше ходят только в для своего процесса, если я не путаю.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51

    TopList