Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2013, 13:51   #1
BarsDG
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 47
По умолчанию Работа с чужим приложением

Доброе время суток уважаемые программисты.
Суть вопроса в следующем:

Есть процедура считывания с чужого листа 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'ов заполнены нулями)
BarsDG вне форума Ответить с цитированием
Старый 21.06.2013, 15:54   #2
BarsDG
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 47
По умолчанию

неужели никто не сталкивался с такой проблемой???
BarsDG вне форума Ответить с цитированием
Старый 21.06.2013, 16:06   #3
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

А зачем всё это, если сплошь и рядом в TTreeNode в поле Data хранятся ссылки на объекты или сами объекты, которые вы никоим образом извлечь не сможете? Пустая трата времени...
ReportCube вне форума Ответить с цитированием
Старый 21.06.2013, 17:55   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в юникоде дело, надо в AnsiString читать тогда.

ReportCube, дык текст извлекается ведь, а он часто доступен.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.06.2013, 10:55   #5
BarsDG
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в юникоде дело, надо в AnsiString читать тогда.
AnsiString в переменных вместо

Код:
var
... 
svText: ShortString
самой процедуры поставить?
BarsDG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление чужим приложением SNUPY Общие вопросы по программированию, компьютерный форум 5 20.04.2011 02:47
Трудности с управлением чужим приложением Tihon Win Api 4 19.04.2010 19:51
Переходник между чужим приложением и его файлами Biohazard Работа с сетью в Delphi 4 13.02.2010 10:31
Простейшая работа с чужим приложением... ActiveX Помощь студентам 1 31.01.2008 08:17
Работа с чужим приложением ERASERROR Win Api 2 28.01.2008 15:22