onguard中的OgUtil.pas我想移植到64位
Delphi 64位不允许使用带有pascal的ASM我可以将此函数转换为使用delphi 64位
function LockFile(Handle : THandle;
FileOffsetLow, FileOffsetHigh,
LockCountLow, LockCountHigh : Word) : Boolean;
var
Error : Word;
begin
asm
mov ax,$5C00
mov bx,Handle
mov cx,FileOffsetHigh
mov dx,FileOffsetLow
mov si,LockCountHigh
mov di,LockCountLow
int $21
jc @@001
xor ax,ax
@@001:
mov Error,ax
end;
Result := Error = 0;
end;
可以将此代码转换为完全pascal
function UnlockFile(Handle : THandle;
FileOffsetLow, FileOffsetHigh,
UnLockCountLow, UnLockCountHigh : Word) : Boolean;
var
Error : Word;
begin
asm
mov ax, $5C01
mov bx,Handle
mov cx,FileOffsetHigh
mov dx,FileOffsetLow
mov si,UnLockCountHigh
mov di,UnLockCountLow
int $21
jc @@001
xor ax, ax
@@001:
mov Error, ax
end;
Result := Error = 0;
end;
Delphi 64位不允许使用带有pascal的ASM我可以将此函数转换为使用delphi 64位 请帮助将此代码转换为pascal
答案 0 :(得分:8)
您通过中断 21h 调用旧的DOS LockFile
和UnlockFile
功能,您可以LockFile和{{更新和替换这些来电3}} WinApi方法,在Windows单元中定义。
function LockFile(hFile: THandle; dwFileOffsetLow, dwFileOffsetHigh: DWORD;
nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh: DWORD): BOOL; stdcall;
function UnlockFile(hFile: THandle; dwFileOffsetLow, dwFileOffsetHigh: DWORD;
nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh: DWORD): BOOL; stdcall;
答案 1 :(得分:5)
Delphi x64编译器确实支持内联汇编程序。没有什么可以阻止你为x64编译器编写内联汇编程序。
但是,这是16位代码,您无法将其移植到32位或64位编译器。我怀疑你在这里有OnGuard支持16位和32位代码。它在需要针对16位和32位代码实现不同的地方使用条件编译。我敢打赌,OnGuard假设任何非32位代码都是16位代码。
因此可能会在某处进行{$IFDEF WIN32}
测试。如果该条件的计算结果为LockFile
,则代码将不会定义UnlockFile
和True
,因为这些函数现在是在Windows API中定义的。当该条件求值为False
时,代码假定为16位并定义函数。但是,由于您试图支持x64,{$IFDEF WIN32}
检查会评估False
并且代码尝试编译16位代码,显然注定要失败。
坦率地说,你能做的最好的事情是从这个库中删除所有16位代码。这将有助于您从树上看到木材。我希望代码中还有其他地方试图使用16位代码,因为在64位编译器中没有定义Win32
。
<强>更新强>
快速查看OnGuard repo会发现这段代码,就像我怀疑的那样:
{$IFNDEF Win32}
function LockFile(Handle : THandle; FileOffsetLow, FileOffsetHigh,
LockCountLow, LockCountHigh : Word) : Boolean;
function UnlockFile(Handle : THandle; FileOffsetLow, FileOffsetHigh,
UnLockCountLow, UnLockCountHigh : Word) : Boolean;
function FlushFileBuffers(Handle : THandle) : Boolean;
{$ENDIF}
还有更多的Win32
测试,假设缺少定义意味着代码是16位。这确实是20世纪世纪的代码!
您需要查看库以了解Win32
条件的所有用法。您找到的每一个都会给x64带来移植问题。
您必须采用的基本策略是,您希望将Win32
变量用于32位和64位。所以,如果我是你,我只会追捕每个Win32
条件,并删除条件。留下条件的Win32
分支。