lsaapi.pas unit
小さな UnicodePChar
を使用して 32 ビット コードを 64 ビット コードに変換する際に問題がありPAnsiChar
ます。
次のコードは 32 ビット モードでは機能しますが、64 ビット モードでは機能しません。プロシージャを実行し (64 ビット デバッグ モードではありません!)、
invalid parameter
呼び出してエラー メッセージを取得します。LsaQueryInformationPolicy()
アイデアはありますか?何が問題なのですか?
このコードを 64 ビット デバッグ モードと非デバッグ モードで実行すると、動作が異なるのはなぜですか?
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;