• 问题-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:delphiBorlandDelphi7Bin 中。
    原因:
    说是因为DLPHI7的内存管理没有XE2的好。
  • 相关阅读:
    rowid去重(转)
    Oracle中 row_number() over()分析函数(转)
    oracle分页计算公式
    vue 生产环境和线上环境配置
    vue postcss 样式等比缩放
    element-ui 表单输入手机号验证是否注册或者存在
    使用vue-qr 生成 二维码
    vue下载excel文件,后台传过来的是文件流解决办法
    前端请求接口发送的路径用域名代替ip
    将本地端口映射子域名
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/4654364.html
Copyright © 2020-2023  润新知