-1

onguard 中的 OgUtil.pas 我想移植到 64 位
Delphi 64 位不允许将 ASM 与 pascal 一起使用 我可以将此函数转换为使用 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;

可以将此代码转换为完全帕斯卡

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位不允许将ASM与pascal一起使用我可以将此函数转换为使用delphi 64位
请帮助将此代码转换为pascal

4

2 回答 2

8

您正在通过中断21h调用旧的 DOSLockFile和函数,您可以通过 在 Windows 单元中定义的LockFileUnlockFile WinApi 方法更新和替换这些调用。UnlockFile

function LockFile(hFile: THandle; dwFileOffsetLow, dwFileOffsetHigh: DWORD;
  nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh: DWORD): BOOL; stdcall;

function UnlockFile(hFile: THandle; dwFileOffsetLow, dwFileOffsetHigh: DWORD;
  nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh: DWORD): BOOL; stdcall;
于 2013-10-10T14:23:08.593 回答
5

Delphi x64 编译器确实支持内联汇编器。没有什么可以阻止您为 x64 编译器编写内联汇编程序。

但是,这是 16 位代码,您不能将其移植到 32 位或 64 位编译器。我怀疑您在这里看到的是 OnGuard 同时支持 16 位和 32 位代码。它在需要对 16 位和 32 位代码进行不同实现的地方使用条件编译。我敢打赌 OnGuard 假定任何不是 32 位代码的东西都是 16 位代码。

所以很可能会在{$IFDEF WIN32}某个地方进行测试。并且代码不会定义LockFileUnlockFile如果该条件评估为,True因为现在在 Windows API 中定义了函数。当该条件计算为 时False,代码假定为 16 位并定义函数。但是由于您正在尝试支持 x64,因此{$IFDEF WIN32}检查评估False并且代码尝试编译 16 位代码,显然注定要失败。

坦率地说,你能做的最好的事情就是从这个库中删除所有的 16 位代码。这将帮助您从树上看到木材。我预计代码中会有其他地方尝试使用 16 位代码,因为Win32它没有在 64 位编译器中定义。

更新

正如我所怀疑的,快速检查 OnGuard 存储库会显示此代码:

{$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条件的分支。

于 2013-10-10T14:13:34.373 回答