小编Adr*_*son的帖子

线程关闭期间Win64 Delphi RTL中的内存泄漏?

很长一段时间我都注意到我的服务器应用程序的Win64版本泄漏了内存.虽然Win32版本在相对稳定的内存占用情况下运行良好,但64位版本使用的内存会定期增加 - 可能是20Mb /天,没有任何明显的原因(不用说,FastMM4没有报告任何内存泄漏) .32位和64位版本的源代码相同.该应用程序是围绕Indy TIdTCPServer组件构建的,它是一个连接到数据库的高度多线程服务器,该数据库处理由Delphi XE2制作的其他客户端发送的命令.

我花了很多时间来查看自己的代码并试图理解为什么64位版本泄露了如此多的内存.最后我使用了专门用于跟踪DebugDiag和XPerf等内存泄漏的MS工具,看起来Delphi 64位RTL中存在一个基本缺陷,每次线程从DLL分离时都会导致某些字节泄露.对于必须在不重新启动的情况下全天候运行的高度多线程应用程序,此问题尤其重要.

我用一个由主机应用程序和库组成的非常基本的项目重现了这个问题,这两个项目都是用XE2构建的.DLL与主机应用程序静态链接.主机应用程序创建只调用虚拟导出过程并退出的线程:

这是库的源代码:

library FooBarDLL;

uses
  Windows,
  System.SysUtils,
  System.Classes;

{$R *.res}

function FooBarProc(): Boolean; stdcall;
begin
  Result := True; //Do nothing.
end;

exports
  FooBarProc;
Run Code Online (Sandbox Code Playgroud)

宿主应用程序使用计时器来创建一个只调用导出过程的线程:

  TFooThread = class (TThread)
  protected
    procedure Execute; override;
  public
    constructor Create;
  end;

...

function FooBarProc(): Boolean; stdcall; external 'FooBarDll.dll';

implementation

{$R *.dfm}

procedure THostAppForm.TimerTimer(Sender: TObject);
begin
  with TFooThread.Create() do
    Start;
end;

{ TFooThread }

constructor TFooThread.Create;
begin
  inherited Create(True);
  FreeOnTerminate := True;
end;

procedure TFooThread.Execute;
begin
  /// …
Run Code Online (Sandbox Code Playgroud)

delphi memory-leaks win64 delphi-xe2

36
推荐指数
1
解决办法
2530
查看次数

将Delphi代码移植到64位 - 为什么没有编译器警告?

我们有一个很大的Delphi XE代码库,我们想要移植到64位.

我拥有Delphi XE2许可证,我找不到任何警告或提示,可以帮助我检测有效的32位结构,现在可以导致64位平台下的数据丢失.例如,对32位编译器完全有效的THandleCardinal赋值在编译Win64时不会引发任何警告.

当使用Delphi 2009迁移到Unicode时,我们有大量的警告帮助我们跟踪和修复可疑代码.有了XE2,我找不到任何东西.我无法想象在编译器级别上没有集成任何内容以避免我们对所有代码进行手动审查.

我错过了什么吗?如果你尝试过,你是如何将项目移植到64位的?

谢谢 !

windows delphi 64-bit win64 delphi-xe2

9
推荐指数
1
解决办法
1490
查看次数

列出Firebird数据库的所有未使用的域

是否有一种快速方法可以列出为数据库定义的所有Firebird域,这些域实际上并未被任何字段使用?我有一个包含许多表和许多域的大型数据库,似乎很多都不再使用了,所以我想是时候进行清理了!

我认为这可以通过查询RDB$...系统表来实现,但我不确定如何做到这一点.

firebird

6
推荐指数
1
解决办法
570
查看次数

具有大量shell项时,SelectDirectory/ShBrowseForFolder问题

我正在与Vcl.FileCtrl功能一个很奇怪的问题SelectDirectory (这是周围的瘦包装的SHBrowseForFolder的Win32 API).

我正在使用以下代码来允许用户浏览文件或文件夹:

  if SelectDirectory('Sélectionnez un élément à ajouter :', '', S, [sdNewFolder,
    sdShowFiles, sdNewUI]) then
Run Code Online (Sandbox Code Playgroud)

执行此代码时,会正确显示"浏览文件夹"对话框,显示用户桌面的内容:

SelectDirectory包含少于100个桌面文件

但是当桌面文件夹中的项目数量过大时(在我的计算机上,我可以通过大约100个桌面图标重现问题),同一个调用会产生完全不同的显示:

SelectDirectory包含超过100个桌面文件

在这种情况下,桌面项目不再显示.我只允许浏览我的主文件夹,因为我丢失了"我的电脑"图标,我无法选择此目录之外的文件/文件夹.

我正在寻找我在这里失踪的东西.根项目对于正确显示的子项目数量是否有限制?拥有大量桌面图标通常不是一个好习惯,但据我所知,不应该阻止此对话框正常运行.我不确定Delphi包装器中是否有什么问题,或者这是我在MSDN上没有看到的API的限制......

任何暗示赞赏!

delphi winapi windows-shell

5
推荐指数
2
解决办法
2044
查看次数