【问题标题】:Use injected dll code as delphi *.dll plugin which contains TForm使用注入的 dll 代码作为包含 TForm 的 delphi *.dll 插件
【发布时间】:2011-07-20 19:09:10
【问题描述】:

也许这是一个蹩脚的问题,但是……
我问了一些关于delphi插件的问题。 dll、bpl、OCX、脚本引擎有什么更好的方法...
我不想分发所有 *.bpls 及其所有依赖项...
我只需要一个包含 TForm 的 *.dll。并且该表单应放置在主机应用程序中。 在 delphi 中没有直接支持这一点(非常可悲的情况)。存在一些解决方法,但 Tab 键等存在问题...
所以非解决方法是完美的。
但也许还有另一种可能。 将dll代码直接注入主机*.exe。 所以 *.exe 会认为注入的代码是他自己的......而且很多问题(例如表单中的制表键)应该消失了。 可能吗?这不是一个肮脏的黑客,例如这种技术“以编程方式”合法吗?
(我没有代码注入经验,也许我在这里说的没有意义;)

最好的问候
彼得

[已编辑]
澄清一些事情......当我们将 TForm 放入 dll 中,然后尝试将此表单嵌入到主机 *.exe 应用程序中时,会出现很多问题。首先是错误“无法将 TFont 分配给 TFont”,但有一些解决方法。
其次是宿主应用程序将整个嵌入形式作为一个组件,因此您不能使用 Tab 键。 (按 Tab 后,焦点将完全跳出嵌入形式)。我们也有一些解决方法,但它远非完美......
所以我有一个想法,如果我们向主机注入一些代码,也许主机会认为嵌入的形式是他自己的代码,所以 Tab 键会起作用。
但正如我之前所说,我对注射一无所知,只是一个(也许)疯狂的想法;)

【问题讨论】:

  • 创建一个显示完美运行的 VCL 表单的 DLL 没有任何问题。我将使用的标准示例是 Office COM 加载项。我有其中之一,使用 Add-in Express 编写的。这是一种享受。你的问题出在其他地方,你肯定需要在任何地方注入任何东西!
  • 这个问题太开放了,如果你在你的问题中解决具体问题会更好。例如,通过使 exe think 注入的代码是它自己的代码来解决什么问题? AFAIK,在 Delphi 应用程序中使用来自 dll 的表单没有通用选项卡问题,我真的看不出如何用这种方法解决这个问题,因为问题可能是全局对象,DLL 中包含的表单将不同于主机应用程序的全局对象。用您的话来说,问题在于 dll 代码对自己的看法,而不是 exe 对 dll 的看法。

标签: delphi dll plugins inject


【解决方案1】:

这完全有可能,无需求助于您描述的任何黑客。例如:

library FormDLL;

uses
  Windows,
  Forms,
  uMyForm in 'uMyForm.pas' {MyForm};

procedure ShowForm(MainFormHandle: HWND); stdcall;
begin
  Application.Handle := MainFormHandle;
  with TMyForm.Create(nil) do begin
    ShowModal;
    Free;
  end;
end;

exports
  ShowForm;

begin
end.

您可以在TMyForm 中添加几乎任何您喜欢的内容。在另一边创建一个 Delphi 应用程序并添加以下代码来调用 DLL:

procedure ShowForm(MainFormHandle: HWND); stdcall; external 'FormDLL.dll';

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ShowForm(Handle);
end;

这表现得非常完美。

所以,恐怕你的问题并不明显。如果您可以提供更多详细信息,请提供。

【讨论】:

  • 你是对的,但在某些情况下表单不会出现,你应该在单独的线程中调用 ShowModal...我创建了一个应用程序,当我调用 showmodal 表单时,它强制 yahoomessenger 加载一个 dll立即消失了,所以我使用了 CreateThread,它工作得很好
  • @opc0de 很难在不知道细节的情况下对此发表评论,但是当您说“强制 Y!messanger 加载 DLL”时,这听起来不像您有一个合作系统。
  • 是的,您的代码运行良好,但有 SHOWMODAL。但是如果我们需要将表单从 dll 嵌入到主机呢? (请参阅我有问题的[“编辑”])
猜你喜欢
  • 1970-01-01
  • 2016-04-02
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
相关资源
最近更新 更多