2011-03-22 98 views
1

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

问候
彼得

[编辑]
为了澄清一些事情...当我们在dll中放入一个TForm并且我们试图将这个表单嵌入到主机* .exe应用程序中时,出现了很多问题。首先是一个错误“无法将TFont分配给TFont”,但是有一些解决方法。
其次是宿主应用程序将整个嵌入表单作为一个组件使用,因此您不能使用Tab键。 (按下标签后,焦点将完全跳出嵌入的表格)。我们也有一些解决方法,但它远离完美...
所以我有一个想法,如果我们注入一些代码给主机,也许主机会认为emebeded形式是他自己的代码,所以选项卡关键将工作。但是,正如我之前所说,我不知道任何关于注入,只是一个(可能)疯狂的想法;)使用注入的dll代码作为delphi * .dll插件,其中包含TForm

+0

无论创建一个显示VCL表单完美行为的DLL,都没有任何问题。我将使用的标准示例是Office COM加载项。我有一个使用Add-in Express编写的程序。它工作的一种享受。你的问题在别处,你肯定需要在任何地方注入任何东西! – 2011-03-22 20:03:30

+0

这个问题太开放了,如果你解决你的问题中的特定问题会更好。例如,通过使e​​xe_think_注入的代码是自己的代码解决了什么问题? AFAIK,在Delphi应用程序中没有使用来自dll的表单的通​​用选项卡问题,我真的不知道如何用这种方法解决这个问题,因为问题可能是全局对象,DLL中包含的表单将不同于主机应用程序的全局对象。用你的话说,问题在于dll代码对自己的想法,而不是exe对dll的看法。 – jachguate 2011-03-22 20:12:14

回答

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。另一方面创建一个德尔福的应用程序,并添加以下代码来调用该DLL:

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

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

这表现得很完美。

所以,恐怕不是很明显你的问题是什么。如果您可以提供更多详细信息,请执行此操作。

+0

你是对的,但在某些情况下,表单不会出现,你应该在一个单独的线程中调用ShowModal ...我创建了一个应用程序,迫使yahoomessenger加载dll,当我呼叫showmodal表单立即消失,所以我用CreateThread,它工作得很好 – opc0de 2011-03-22 21:49:54

+0

@ opc0de很难评论,不知道细节,但它听起来不像你有一个当你说“强迫Y!messanger加载DLL”的合作系统。 – 2011-03-22 21:54:31

+0

是的,你的代码工作完美,但有SHOWMODAL。但是,当我们需要从dll嵌入到主机的情况下呢? (请参阅我的[“编辑”]问题) – Peter 2011-03-23 20:37:03