У меня есть устаревшее приложение, написанное на Delphi, и мне нужно создать механизм для
- чтение и
- письмо
данные из/в TStringGrid.
У меня нет исходного кода приложения, нет интерфейса автоматизации и маловероятно, что производитель его предоставит.
Поэтому я создал
- DLL C++, которая внедряет
- DLL Delphi (написанная мной) в
- адресное пространство устаревшего приложения.
DLL 2 получает доступ к экземпляру TStringGrid внутри устаревшего приложения, считывает значения ячеек и записывает их в журнал отладки.
Чтение работает нормально. Но когда я пытаюсь записать данные в ячейку сетки, используя вызов типа
realGrid.Cells[1,1] := 'Test';
происходит нарушение прав доступа.
Вот код:
procedure DllMain(reason: integer) ;
type
PForm = ^TForm;
PClass = ^TClass;
PStringGrid = ^TStringGrid;
var
[...]
begin
if reason = DLL_PROCESS_ATTACH then
begin
handle := FindWindow('TForm1', 'FORMSSSSS');
formPtr := PForm(GetVCLObjectAddr(handle) + 4);
if (not Assigned(formPtr)) then
begin
OutputDebugString(PChar('Not assigned'));
Exit;
end;
form := formPtr^;
// Find the grid component and assign it to variable realGrid
[...]
// Iterate over all cells of the grid and write their values into the debug log
for I := 0 to realGrid.RowCount - 1 do
begin
for J := 0 to realGrid.ColCount - 1 do
begin
OutputDebugString(PChar('Grid[' + IntToStr(I) + '][' + IntToStr(J) + ']=' + realGrid.Cells[J,I]));
// This works fine
end;
end;
// Now we'll try to write data into the grid
realGrid.Cells[1,1] := 'Test'; // Crash - access violation
end;
end; (*DllMain*)
Как я могу записывать данные в TStringGrid без проблем с нарушением прав доступа?
Cells
не работает, почему вызовSetCells
должен быть другим? Предположительно, вы можете прочитатьSetCells
с помощником класса, чтобы взломать частную видимость. VMT не поможет, потому чтоSetCells
не виртуальный. - person David Heffernan   schedule 17.09.2012Cells[1,1]
удалит предыдущее значение. Но освободите его в неправильной куче. - person David Heffernan   schedule 17.09.2012