我一直在编写一个理想情况下将在后台服务器上运行而不会关闭的程序 - 因此,任何内存泄漏都不存在是很重要的.我的程序涉及使用Windows终端服务API(wtsapi32.dll)检索实时会话信息,并且因为信息必须是活动的,所以每隔几秒运行一次该函数,我发现调用该WTSEnumerateSessionsEx函数会导致相当大的内存泄漏.似乎WTSFreeMemoryExMSDN文档中指示的调用似乎没有影响,但我从任一调用都没有收到任何错误消息.
总结一下:问题不在执行中,WTSEnumerateSessionsEx因为返回了有效数据; 内存根本没有被释放,这会导致长时间运行时出现问题.
目前,当使用的存储器超过阈值时,短期解决方案是重新启动该过程,但是这似乎不是令人满意的解决方案并且纠正这种泄漏将是最期望的.
枚举类型直接来自Microsoft MSDN文档.
附件是相关的源文件.
unit WtsAPI32;
interface
uses Windows, Classes, Dialogs, SysUtils, StrUtils;
const
WTS_CURRENT_SERVER_HANDLE = 0;
type
WTS_CONNECTSTATE_CLASS = (WTSActive, WTSConnected, WTSConnectQuery,
WTSShadow, WTSDisconnected, WTSIdle, WTSListen, WTSReset, WTSDown,
WTSInit);
type
WTS_TYPE_CLASS = (WTSTypeProcessInfoLevel0, WTSTypeProcessInfoLevel1,
WTSTypeSessionInfoLevel1);
type
WTS_SESSION_INFO_1 = record
ExecEnvId: DWord;
State: WTS_CONNECTSTATE_CLASS;
SessionId: DWord;
pSessionName: LPtStr;
pHostName: LPtStr;
pUserName: LPtStr;
pDomainName: LPtStr;
pFarmName: LPtStr;
end;
type
TSessionInfoEx = record
ExecEnvId: DWord;
State: WTS_CONNECTSTATE_CLASS;
SessionId: DWord;
pSessionName: string; …Run Code Online (Sandbox Code Playgroud) 我知道在加载时隐式链接到库可能会导致性能提升,因此我想知道在编译时以这种方式链接是否是一种好的做法,从而增加可执行文件大小(不可否认,这只是边际)与明确链接相比在运行时.我的问题是,当链接到位于System32中的Microsoft Windows DLL文件时,在加载时链接是否"更好",因为您可以确定库存在或遵循显式方法?
使用的语言是Delphi(pascal),有问题的库是WTsAPI32.dll - 终端服务.
编辑:正如所指出的那样 - 我选择的语言不正确并且已经修改.另外,由于在Unix中只有每一个与库有很多链接,我对可执行文件大小的评论可以省略,我当时认为我实际上是指静态链接将库代码捆绑到可执行文件中,我现在意识到这一点使用dll文件时是不可能的(DUH!).谢谢大家.