从Delphi网格读取数据
我在Delphi中有一个网格应用程序 我需要创建另一个应用程序,它应该 a) 从网格中读取数据,然后 b) 将数据写入网格 一,。E模拟人类用户的动作 为了从表中读取数据,我使用以下代码:从Delphi网格读取数据,delphi,delphi-2009,access-violation,Delphi,Delphi 2009,Access Violation,我在Delphi中有一个网格应用程序 我需要创建另一个应用程序,它应该 a) 从网格中读取数据,然后 b) 将数据写入网格 一,。E模拟人类用户的动作 为了从表中读取数据,我使用以下代码: Procedure TForm1.Button1Click(Sender: TObject); type PForm = ^TForm; PClass = ^TClass; var formPtr : PForm; I: Integer; msg : string; windowHan
Procedure TForm1.Button1Click(Sender: TObject);
type
PForm = ^TForm;
PClass = ^TClass;
var
formPtr : PForm;
I: Integer;
msg : string;
windowHandle : HWND;
begin
windowHandle := FindWindow('TForm1', 'FORMSSSSS');
formPtr := PForm(GetVCLObjectAddr(windowHandle) + 4);
if (not Assigned(formPtr)) then Exit;
for I := 0 to formPtr^.ControlCount - 1 do // Error
begin
msg := msg + formPtr^.Controls[i].Name;
if formPtr^.Controls[i].Name = 'StringGrid1' then
begin
msg := TStringGrid(formPtr^.Controls[i]).Cells[1, 1];
end;
end;
ShowMessage(msg);
end;
function GetVCLObjectAddr(AHandle: HWND): DWORD;
var
pid: DWORD;
begin
pid := 0;
GetWindowThreadProcessId(AHandle, pid);
if (pid =0) then
begin
Result := 0;
Exit;
end;
Result := GetPropW(AHandle, PWideChar(WideString(Format('Delphi%.8X', [PID]))))
end;
在带有“错误”注释的行中,出现以下问题:
Project 1.exe引发了异常类EAccessViolation,消息为“Access”
模块“Project1.exe”中地址0046C8C3处存在冲突。阅读地址01262984’
当我在该行上放置一个断点并检查“watchs”选项卡中表达式“formPtr^”的值时,我得到了“unaccessible value”消息
为了能够从网格中读取数据,应该如何修改代码
UPD:
如果我将代码更改为下面给出的版本,内存问题就会消失。但另一个问题出现了——控制计数等于零
Procedure TForm1.Button1Click(Sender: TObject);
var
formPtr : TForm;
I: Integer;
msg : string;
windowHandle : HWND;
begin
windowHandle := FindWindow('TForm1', 'FORMSSSSS');
formPtr := TForm(GetVCLObjectAddr(windowHandle) + 4);
if (not Assigned(formPtr)) then Exit;
for I := 0 to formPtr.ControlCount - 1 do
begin
msg := msg + formPtr.Controls[i].Name;
if formPtr.Controls[i].Name = 'StringGrid1' then
begin
msg := TStringGrid(formPtr.Controls[i]).Cells[1, 1];
end;
end;
ShowMessage(msg);
end;
这种做法行不通。您的两个进程具有独立的地址空间。地址和对象仅在拥有该地址或对象的进程的上下文中才有意义。您只能对驻留在流程中的对象调用方法。这是行不通的。您的两个进程具有独立的地址空间。地址只有在拥有该内存的进程的上下文中才有意义。您将需要公开一个自动化接口,以便一个进程可以自动执行另一个进程中的操作。有没有示例说明如何执行此操作?基本上,我需要开发应用程序A(在Delphi或C#或C++中),它将控制(按按钮,读/写到/从文本字段)Delphi应用程序B(我无法修改)。另请参阅我对原始问题的更新。您可以在这里找到一些关于如何在两个过程之间通信的好建议:。关于您的更新,还是不行。你把头埋在沙子里了。您有两个独立的地址空间。是的,但是如果您将代码(类似于上面给出的代码)放入DLL,然后将其注入目标应用程序的地址空间(如中所述),就可以读取TStringGrid的值。确实如此。这正是我的观点。注入导致所有代码在同一进程中运行。