【问题标题】:delphi exe and dll without build with runtime packages没有使用运行时包构建的 delphi exe 和 dll
【发布时间】:2010-10-21 12:42:07
【问题描述】:

对于我的上一个项目,我在我的 delphi 应用程序中使用了许多框架,所以我决定创建 dll 并将它们放入 dll 中(全部在 Delphi 中创建)

我浏览了许多网站并提出了可行的代码,但对于那个示例,我必须使用 使用运行时包构建 来编译应用程序和 dll,这意味着我还必须分发 bpls .如果不使用运行时包检查构建错误即将到来

这是我找到的代码

在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

在 dll 中

Function  GetTheFrame( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall;
Begin
 Result := TFrame2.Create( Owner );

 Result.Parent := TheParent;
End;

仅此而已,但我希望这段代码在没有运行时包的情况下也能工作

【问题讨论】:

  • 但我确信代码很好,因为它可以与 runtimw=e 包一起使用
  • 第一个GetTheFrame 电话的目的是什么?如果它的目的不是随机破坏你的记忆,那么你就用错了。编译器应该警告你在那里使用了一个未初始化的变量。
  • 你误会了。第一次调用是错误的有两个原因(不仅仅是有时,而是总是)。 GetTheFrame 是一个局部变量,所以在进入Button1Click 时,它不会有一个有效值。特别是,它不会引用 DLL 函数。即使它确实引用了一个有效的函数,它也没有完成任何事情。它会释放的唯一内存是它刚刚分配的内存。这是一个毫无意义的调用,因为它没有释放之前未分配的任何东西。
  • 此外,您将在创建对象后立即卸载 DLL。你不应该那样做。您创建的对象仍然需要 DLL 驻留在内存中,否则对象的代码将消失。对象的内存也将不再被管理,因为它是由 DLL 的内存管理器副本管理的,当然它已经消失了。
  • 您认为您首先使用 DLL 会获得什么?无论如何,您必须分发 dll,您不妨将框架包含在 exe 本身中并省去麻烦。

标签: delphi dll runtime frame bpl


【解决方案1】:

太糟糕了。如果没有运行时包,该代码将无法工作。 (运行时包,你应该使用LoadPackage而不是LoadLibrary。)

如果没有包,程序的每个模块(EXE 和每个 DLL)都有自己的所有标准类定义的副本,包括TFrameTWinControl,甚至TObject。 EXE 中的 TWinControl 类在 DLL 中看起来不像 TWinControl

由于您在模块之间共享类,因此您需要确保它们都具有这些类的相同定义,而运行时包就是您这样做的方式。

如果您真的不使用运行时包,那么您需要更改 DLL 的接口,使其不共享任何 Delphi 对象类型。代替TWinControl 父窗口,传递控件的Handle 属性或任何其他HWnd 值作为父窗口。 DLL 代码将无法再假定父级存在 Delphi 对象,EXE 将无法假定它接收的控件是 Delphi 对象;他们将被限制使用 Windows API 来操作窗口句柄和发送消息。

【讨论】:

  • 句柄可以作为参数传递,并作为 DLL 中函数的结果返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多