对于我的上一个项目,我在 Delphi 应用程序中使用了许多框架,所以我决定创建 dll 并将它们放入 dll 中(全部在 Delphi 中创建)
我浏览了许多网站并提出了有效的代码,但对于该示例,我必须使用以下命令编译应用程序和 dll使用运行时包构建这意味着我还必须分发 bpls。如果不检查运行时包的构建,则会出现错误
这是我找到的代码
in exe
procedure TForm1.Button1Click(Sender: TObject);
type
TGetTheFrame =Function( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall ;
var
GetTheFrame : TGetTheFrame;
begin
try
GetTheFrame(application,TabSheet1).Free ;
except
end;
frm := GetTheFrame(application,TabSheet1) ;
dllHandle := LoadLibrary('project1.dll') ;
if dllHandle <> 0 then
begin
GetTheFrame := GetProcAddress(dllHandle, 'GetTheFrame') ;
frm := GetTheFrame(application,TabSheet1) //call the function
{ ShowMessage('error function not found') ;
FreeLibrary(dllHandle) ; }
end
else
begin
ShowMessage('xxxx.dll not found / not loaded') ;
end
in dll
Function GetTheFrame( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall;
Begin
Result := TFrame2.Create( Owner );
Result.Parent := TheParent;
End;
这就是全部,但我希望这段代码可以在没有运行时包的情况下工作
太糟糕了。如果没有运行时包,该代码将无法运行。 (和with运行时包,你应该使用LoadPackage
代替LoadLibrary
.)
如果没有包,程序的每个模块(EXE 和每个 DLL)都有自己的所有标准类定义的副本,包括TFrame
, TWinControl
, 乃至TObject
. A TWinControl
EXE 中的类看起来不像TWinControl
到DLL。
由于您在模块之间共享类,因此您需要确保它们都具有这些类的相同定义,而运行时包就是您执行此操作的方法。
如果您确实不会使用运行时包,那么您需要更改 DLL 的接口,以便它不共享任何 Delphi 对象类型。而不是TWinControl
父级,传递控件的Handle
财产,或任何其他HWnd
值作为父窗口。 DLL 代码将无法再假定父级存在 Delphi 对象,并且 EXE 将无法假定它接收的控件是 Delphi 对象;他们将被限制使用 Windows API 来操作窗口句柄和发送消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)