我有一个用 Delphi 编写的遗留应用程序,需要建立一个机制
- 阅读和
- 写作
来自/到 TStringGrid 的数据。
我没有应用程序的源代码,没有自动化接口,供应商不太可能提供。
因此我创建了
- 一个 C++ DLL,它注入
- 一个 Delphi DLL(由我编写)到
- 遗留应用程序的地址空间。
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?