2013-10-10 73 views
-1

OgUtil.pas中的OnGuard我想移植到64位
德爾福64位不允許使用ASM與帕斯卡爾我可以轉換這個功能用delphi 64位轉換爲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; 

德爾福64位不允許使用ASM與帕斯卡爾我可以轉換這個功能用delphi 64位
工作請幫助這個轉換代碼帕斯卡爾

+2

鑑於16位文件句柄和偏移量,我懷疑此代碼是否適用於32位Windows。問題*轉換*這個代碼是否真的是最好的動作; *刪除*它可能更合適。無論如何,OS已經提供了文件鎖定API函數。 –

回答

5

Delphi x64編譯器確實支持嵌入式彙編程序。沒有什麼能阻止您爲x64編譯器編寫內聯彙編程序。

但是,這是16位代碼,您不能將其移植到32位或64位編譯器。我懷疑你在這裏的是OnGuard支持16位和32位代碼。它在需要16位和32位代碼的不同實現的地方使用條件編譯。我敢打賭,OnGuard認爲任何非32位代碼都是16位代碼。

所以可能會有一個{$IFDEF WIN32}測試的地方。如果該條件評估爲True,代碼將不會定義LockFileUnlockFile,因爲現在在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 th世紀代碼!

您需要通過該庫查看Win32條件的所有用法。你找到的每一個都會爲x64提出一個移植問題。

您必須採用的基本策略是您想要使用32位和64位的Win32變體。所以如果我是你,我只是簡單地追捕每個Win32條件並刪除條件。留下Win32分支的條件。

8

您是通過中斷21H調用老的DOS LockFileUnlockFile功能,您可以更新和替換的這些呼籲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;