从外部应用程序将数据写入Delphi TStringGrid

从外部应用程序将数据写入Delphi TStringGrid,第1张

概述我有一个用Delphi编写的遗留应用程序,需要构建一个机制 >阅读和 >写作 来自/到TStringGrid的数据. 我没有应用程序的源代码,没有自动化接口,供应商不太可能提供. 因此我创造了 >一个C DLL,它注入 >一个Delphi DLL(由我编写)到 >遗留应用程序的地址空间. DLL 2可以访问遗留应用程序内的TStringGrid实例,读取单元格值并将它们写入调试日志. 阅读工作正常 我有一个用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?

解决方法 这种方法根本不起作用.目标可执行文件中有两个VCL实例.一个由目标应用程序拥有,另一个由DLL拥有.这是一个VCL实例太多了.如果使用完全相同版本的Delphi来构建目标应用程序和DLL,那么您可能可以逃脱.

但是,您仍然可以使用两个堆管理器.并且您的代码在不同的VCL实例之间传递堆分配的内存.您将在一个堆中分配并在另一个堆中解除分配.这不起作用,将导致访问冲突.

您正在将DLL堆中分配的字符串传递给使用目标应用程序堆的字符串网格对象.那是行不通的.

我认为访问冲突将发生在DLL代码尝试释放由目标应用程序的堆管理器分配的单元格[i,j]的先前值的位置.

基本上你正在尝试的是不会工作.你可以找到目标应用程序的TStringGrID.SetCell实现的地址,并伪造一个调用.但是您还需要找到目标应用程序的GetMem,FreeMem等实现,并确保从DLL到目标应用程序的所有动态内存都已由目标应用程序堆分配和释放.你将有一个工作的魔鬼使这项工作.当然,如果目标应用程序和DLL都使用共享内存管理器,那么您可能只能使这种方法成为可能.

更简单的是伪造键盘输入.我个人会考虑使用autoHotKey的可行性.

总结

以上是内存溢出为你收集整理的从外部应用程序将数据写入Delphi TStringGrid全部内容,希望文章能够帮你解决从外部应用程序将数据写入Delphi TStringGrid所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1237377.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存