gpt4 book ai didi

delphi - Debug和Release模式下调用64位API函数的区别

转载 作者:行者123 更新时间:2023-12-01 16:30:25 28 4
gpt4 key购买 nike

我在使用 lsaapi.pas unit 将 32 位代码转换为 64 位代码时遇到问题进行了小的 Unicode PCharPAnsiChar 校正。

以下代码可以在 32 位模式下运行,但不能在 64 位模式下运行。运行程序(不是在 64 位 Debug模式下!),获取错误消息调用 LsaQueryInformationPolicy()

时出现 无效参数

有什么想法吗?出了什么问题?
为什么在 64 位调试和非 Debug模式下运行此代码会有不同的行为?
也许是 64 位的记录对齐问题?

这是代码:

uses
lsaapi;

function GetDomainName: string;
var
Buffer: Pointer;
Status: NTStatus;
PolicyHandle: LSA_HANDLE;
ComputerName: TLsaUnicodeStr;
Attributes: TLsaObjectAttributes;
PolicyAccountDomainInfo: PPolicyAccountDomainInfo;
begin
ComputerName := TLsaUnicodeStr.CreateFromStr('');
try
FillChar(Attributes, SizeOf(Attributes), 0);
Status := LsaOpenPolicy(ComputerName.Value, Attributes,
POLICY_VIEW_LOCAL_INFORMATION, PolicyHandle);
if Status <> STATUS_SUCCESS then
raise Exception.Create('LsaOpenPolicy Failed: ' +
SysErrorMessage(LsaNtStatusToWinError(Status)));
try
Status := LsaQueryInformationPolicy(PolicyHandle,
PolicyPrimaryDomainInformation, Buffer);
if Status <> STATUS_SUCCESS then
raise Exception.Create('LsaQueryInformationPolicy Failed: ' +
SysErrorMessage(LsaNtStatusToWinError(Status)));
try
PolicyAccountDomainInfo := Buffer;
Result := PolicyAccountDomainInfo.DomainName.Buffer;
finally
LsaFreeMemory(Buffer)
end;
finally
LsaClose(PolicyHandle)
end;
finally
ComputerName.Free;
end;
end;

最佳答案

lsaapi 单元中的所有记录都被声明为已打包。 Windows API 头文件不使用打包结构。通过删除所有 packed 修饰符来修复它。如果您进行此更改,您的函数在 32 位和 64 位目标中都会成功。

无论如何,您的代码实际上在调用 LsaOpenPolicy 时失败。对于打包记录,SizeOf(Attributes) 返回 40。正确的大小是 48,这就是删除 packed 修饰符时获得的值。

调试此类事情的最简单方法是安装 Visual Studio 的副本,以便您可以比较等效的 C++ 代码。

我认为不正确的记录声明是该单元的主要问题。可能还有很多其他的,但那就是最突出的一个。

关于delphi - Debug和Release模式下调用64位API函数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12138952/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com