Ver Mensaje Individual
  #29  
Antiguo 17-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por islu
pues la aplicación no llega ni a arrancar, en el "Application.Initialize;" he puesto un break point, y me sale antes de llegar a este punto.
Quizá no lo sepas pero el código que tú ves en el archivo .dpr no es lo primero en ejecutarse. Hay de hecho muchísimo código que se ejecuta antes de llegar siquiera al primer begin.

Para empezar está todo el código de la unidad System, la única unidad omnipresente en Delphi, y luego todo el código de las secciones initialization de cada una de las unidades incluidas en el proyecto, tanto las que uno pone explicitamente como las que son incluidas dentro de otras, y creeme, son muchísimas.

De hecho, si te fijas, la primera línea de código en el archivo .dpr,

Application.Initialize

hace referencia a un objeto, Application. Como todo objeto en Delphi, éste debe ya estar creado antes de llamar a ninguno de sus métodos. Tal objeto se crea en la sección initialization de la unidad Forms.

El tipo de error al que te enfrentas seguramente se genera en alguna de estas secciones, razón por la cual jamás se llega ni siquiera al begin del dpr.

Puedes de hecho hacer un debug de todo esto habilitando la opción "Use debug dcus" en Project|Options|Compiler y comenzando la ejecución con F8 y continuando paso a paso con F7. Incluso, si uno es suficientemente paciente, es posible que alcances a ver el punto casi exacto donde se produce el error.

Pero antes de tal aventura, haz el experimento tal como te indiqué tan sólo para ver si por ahí va el problema. Más aún, dado que el error podría estarse produciendo antes de que se ejecuta la sección initialization del formulario sería mejor que crees una unidad nueva con sólo dicho código:

Código:
unit TestPacthInt3;

interface

implementation

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;

initialization
  PatchInt3;
end.
Así, tal cual. Copia, pega y guarda el archivo.

Incluye la unidad al principio de la cláusula uses del dpr:

Código:
program Project1;

uses
  TestPatchInt3,
  Forms,

  etc.
...
para que sea la primera en ser procesada, aún antes de la unidad Forms.

// Saludos
Responder Con Cita