Работа с чужим приложением
Доброе время суток уважаемые программисты.
Суть вопроса в следующем:
Есть процедура считывания с чужого листа 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'ов заполнены нулями)
|