问题-Delphi编译到最后Linking时总是出现与ntdll.dll有关的错误还有Fatal Error Out of memory错误

1.跳出错误法 ===================================================

在主界面的implementation {$R *.dfm} 下放入以下代码:

procedure PatchInt3;

var

NOP: Byte;

NTDLL: THandle;

BytesWritten: DWORD;

Address: Pointer;

begin

if Win32Platform <> VER_PLATFORM_WIN32_NT then

Exit;

NTDLL := GetModuleHandle('NTDLL.DLL');

if NTDLL = 0 then

Exit;

Address := GetProcAddress(NTDLL, 'DbgBreakPoint');

if Address = nil then

Exit;

try

if Char(Address^) <> #$CC then

Exit;

NOP := $90;

if WriteProcessMemory(GetCurrentProcess, Address, @NOP, 1, BytesWritten) and (BytesWritten = 1) then

FlushInstructionCache(GetCurrentProcess, Address, 1);

except // Do not panic if you see an EAccessViolation here, it is perfectly harmless!

on EAccessViolation do ;

else

raise;

end;

end;

然后在窗体的Create中调用 PatchInt3 ;或者在窗体代码的最后一个end.前加入一下代码即可以解决

//-------------------------------------------------------------- i

initialization

begin

PatchInt3; //防止关闭窗口时出现CPU: ntdll.DbgBreakPoint

end;

2.DELPHI 7控件漏洞法=====================================================

文件名:D7ComboBoxStringsGetPatch.pas

原代码:

unit D7ComboBoxStringsGetPatch;

// The patch fixes TCustomComboBoxStrings.Get method for empty string item in Delphi 7.

interface

{$IF RTLVersion <> 15.0}

'This patch is intended for Delphi 7 only';

{$IFEND}

implementation

uses

Windows, SysUtils, StdCtrls;

resourcestring

RsPatchingFailed = 'TCustomComboBoxStrings.Get patching failed.';

type

TPatchResult = (prNotNeeded, prOk, prError);

function PatchCode(RoutineStartAddr: Pointer; PatchOffset: Cardinal; OriginalCode: Pointer;

OriginalCodeLen: Cardinal; PatchedCode: Pointer; PatchedCodeLen: Cardinal): TPatchResult;

const

JmpOpCode = $25FF;

type

PPackageThunk = ^TPackageThunk;

TPackageThunk = packed record

JmpInstruction: Word;

JmpAddress: PPointer;

end;

var

CodeStart: Pointer;

BytesWritten: DWORD;

begin

if FindClassHInstance(System.TObject) <> HInstance then

with PPackageThunk(RoutineStartAddr)^ do

if JmpInstruction = JmpOpCode then

RoutineStartAddr := JmpAddress^

else

begin

Result := prError;

Exit;

end;

CodeStart := Pointer(LongWord(RoutineStartAddr) + PatchOffset);

if CompareMem(CodeStart, OriginalCode, OriginalCodeLen) then

begin

if WriteProcessMemory(GetCurrentProcess, CodeStart, PatchedCode, PatchedCodeLen, BytesWritten) and

(BytesWritten = PatchedCodeLen) then

begin

FlushInstructionCache(GetCurrentProcess, CodeStart, PatchedCodeLen);

Result := prOk;

end

else

Result := prError;

end

else

Result := prNotNeeded;

end;

type

TCustomComboBoxStringsHack = class(TCustomComboBoxStrings);

function AddrOfTCustomComboBoxStringsGet: Pointer;

begin

Result := @TCustomComboBoxStringsHack.Get;

end;

procedure PatchTCustomComboBoxStringsGet;

const

OriginalCode: Cardinal = $74FFF883; // CMP EAX, -1 | JZ +$26

PatchedCode: Cardinal = $7E00F883; // CMP EAX, 0 | JLE +$26

PatchOffset = $1F;

// for DEBUG DCU by Pavel Rogulin

OriginalCodeD: Cardinal = $FFF07D83;

PatchedCodeD: Cardinal = $00F07D83;

PatchOffsetD = $2E;

var

PatchResult: TPatchResult;

begin

PatchResult := PatchCode(AddrOfTCustomComboBoxStringsGet, PatchOffset, @OriginalCode, SizeOf(OriginalCode),

@PatchedCode, SizeOf(PatchedCode));

if PatchResult = prNotNeeded then

PatchResult := PatchCode(AddrOfTCustomComboBoxStringsGet, PatchOffsetD, @OriginalCodeD, SizeOf(OriginalCodeD),

@PatchedCodeD, SizeOf(PatchedCodeD));

case PatchResult of

prError:

begin

if IsConsole then

WriteLn(ErrOutput, RsPatchingFailed)

else

MessageBox(0, PChar(RsPatchingFailed), nil, MB_OK or MB_ICONSTOP or MB_TASKMODAL);

RunError(1);

end;

end;

end;

initialization

PatchTCustomComboBoxStringsGet;

end.

3.内存处理法(这个也是我单位出现的问题)==========================

方法:

将XE2的borlndmm.dll,rlink32.dll二个文件给复制到D:\delphi\Borland\Delphi7\Bin 中。

原因:

说是因为DLPHI7的内存管理没有XE2的好。