转换为Delphi 64位?

时间:2013-10-10 14:10:05

标签: delphi 64-bit

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

2 个答案:

答案 0 :(得分:8)

您通过中断 21h 调用旧的DOS LockFileUnlockFile功能,您可以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,则代码将不会定义UnlockFileTrue,因为这些函数现在是在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分支。