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にデータを書き込むにはどうすればよいですか?