![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Доброе время суток уважаемые программисты.
Суть вопроса в следующем: Есть процедура считывания с чужого листа ListView или syslistview32 в свой TStringGrid Код:
procedure GetListViewGrid(ALVHandle: HWND; AColumnCount, AItemCount: Integer; ADataGrid: TStringGrid); const cchTextMax=255; var hProcess: THandle; dwProcessID: DWORD; dwWriten: DWORD; LVItemCount: Integer; i, j, nTextLength: Integer; pLVItem: ^LV_ITEM; LVItem: LV_ITEM; pszText: PChar; svText: ShortString; begin if ALVHandle=0 then Exit; // Получаем количество строк LVItemCount := ListView_GetItemCount(ALVHandle); if AItemCount>LVItemCount then Exit; if AItemCount>0 then LVItemCount := AItemCount; // Получаем ID процесса, которому принадлежит найденное окно dwProcessID := 0; GetWindowThreadProcessId(ALVHandle, @dwProcessID); if dwProcessID=0 then ExitProcess(GetLastError); // Открываем процесс //hProcess := 0; hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID); if hProcess=0 then ExitProcess(GetLastError); // Выделяем в нем память под текстовый буффер pszText := VirtualAllocEx(hProcess, nil, cchTextMax, MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); // Выделяем в нем память под структуру LVITEM pLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); // Устанавливаем колич строк и столбцов в TStringGrid ADataGrid.RowCount := LVItemCount; ADataGrid.ColCount := AColumnCount; // Заполняем структуру ZeroMemory(@LVItem, SizeOf(LV_ITEM)); LVItem.Mask := LVIF_TEXT; LVItem.pszText := pszText; LVItem.cchTextMax := cchTextMax; // Считываем строки for i := 0 to LVItemCount do begin LVItem.iSubItem := 0; // Пишем ее в память удаленного процесса if not WriteProcessMemory(hProcess, pLVItem, @LVItem, SizeOf(LV_ITEM), dwWriten) then Exit; nTextLength := sendMessage(ALVHandle, LVM_GETITEMTEXT, i, Integer(pLVItem)); // Читаем результат ZeroMemory(@svText, cchTextMax); ReadProcessMemory(hProcess, LVItem.pszText, @svText[1], nTextLength, dwWriten); // заполняем строки TStringGrid ADataGrid.Cells[1, i+1] := StrPas(PChar(@svText[1])); // Считываем столбцы for j := 0 to AColumnCount do begin LVItem.iSubItem := j; // Пишем ее в память удаленного процесса if not WriteProcessMemory(hProcess, pLVItem, @LVItem, SizeOf(LV_ITEM), dwWriten) then Exit; nTextLength := sendMessage(ALVHandle, LVM_GETITEMTEXT, i, Integer(pLVItem)); // Читаем результат ZeroMemory(@svText, cchTextMax); ReadProcessMemory(hProcess, LVItem.pszText, @svText[1], nTextLength, dwWriten); // заполняем столбцы TStringGrid ADataGrid.Cells[j, i] := StrPas(PChar(@svText[1])); end; end; // Освобождаем ранее выделенную память VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE); VirtualFreeEx(hProcess, pLVItem, 0, MEM_RELEASE); // Закрываем описатель процесса CloseHandle(hProcess); end; и ее вызов Код:
... d := FindWindowEx(H3, 0, 'ListView20WndClass', nil); GetListViewGrid(d, 2, 0, FindComponent(Format('StringGrid%d', [q])) as TStringGrid); ... Проблема в том, что в Delphi7, ячейки моих StringGrid'ов заполняются, а в DelphiXE ячейки StringGrid'ов становятся ПУСТЫМИ. (Предварительно ячейки моих StringGrid'ов заполнены нулями) |
#2
|
||||
|
||||
![]() ну так приставка Wide как обычно в таких случаях...
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
![]() Цитата:
Не понимаю, к чему это? |
#4
|
||||
|
||||
![]() String - WideString, Char - WideChar, PChar - PWideChar
Пишу программы за еду. __________________ |
#5
|
|||
|
|||
![]() Цитата:
Мне кажется что дело не в кодировке. Последний раз редактировалось Barsdg, 21.06.2013 в 16:26. |
#6
|
||||
|
||||
![]() а что ты сделал, что не помогает? SendMessageW() тоже не помогло что-ли?
Пишу программы за еду. __________________ |