转换为Delphi 64位?

-1 delphi 64-bit

ong中的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;
Run Code Online (Sandbox Code Playgroud)

可以将此代码转换为完全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;
Run Code Online (Sandbox Code Playgroud)

Delphi 64位不允许使用ASM和pascal我可以将此函数转换为使用delphi 64位
请帮助将此代码转换为pascal

RRU*_*RUZ 8

您呼叫的老的DOS LockFileUnlockFile通过中断功能21H,您可以更新和替换的这些呼吁和LockFileUnlockFile 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;
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 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位代码,因为Win3264位编译器中没有定义.

更新

并且快速检查一下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}
Run Code Online (Sandbox Code Playgroud)

还有更多的测试Win32假设缺少定义意味着代码是16位.这真是20 世纪的代码!

您需要查看库以了解Win32条件的所有用法.您找到的每一个都会呈现x64的移植问题.

您必须采用的基本策略是您希望将Win32变量用于32位和64位.所以,如果我是你,我会简单地追捕每个Win32条件并删除条件.留下Win32有条件的分支.