![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Cita:
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.
Incluye la unidad al principio de la cláusula uses del dpr: Código:
program Project1; uses TestPatchInt3, Forms, etc. ... // Saludos |
|
#2
|
||||
|
||||
|
Luego de recorrer un rato los grupos de noticias de Borland estoy más convencido de que el problema se debe a lo que te he comentado. Algunos mensajes en dichos grupos hacen referencia explícita al uso de iconos con más de 16 colores.
Yo no me preocuparía mayormente, el hecho de que la aplicación se detenga en DbgUserBreakPoint significa que eso sólo ocurrirá al hacer un "debug" de la aplicación. Por cierto que, contrario a lo que se dijo en el primer mensaje de este hilo así como en su título, esto no es una excepción, es un "breakpoint" como el que podríamos nosotros poner en otras partes del código. Algunas personas comentan que el problema se arregla instalando el service pack 2 de windows 2000 aunque otros afirman que ni con eso. De cualquier manera no está de más que te asegures de tener el último service pack instalado. // Saludos |
|
#3
|
|||
|
|||
|
GRACIIIIIAAAAAAAAAAAAAAASSSSSSSSSSSSS !!!!!!!!!
Por fin, ya me funciona, con la función PatchINT3, implementada como una unit nueva, puesta en primer lugar en el uses del dpr; tal y como me has indicado Roman. Mil gracias, de verdad, mil gracias. Espero que además de a mi, esto sirva a alguién más. Por cierto, tengo el Service Pack 2, y pese a ello seguía pasando. GRACIAS. |
|
#4
|
||||
|
||||
|
Cita:
¡A qué esperas y ponle ya el sp4! Y cuando lo hagas vuelve a probar quitando PatchInt3 a ver si Microsoft corrigió el problema en este service pack. // Saludos |
|
#5
|
|||
|
|||
|
Yo no consigo que ese procedimiento me funcione y estoy hasta las narices de microsoft y sus puntos de ruptura, alguien me puede echar un cable? Me falta ponerme a llorar.
Gracias |
|
#6
|
|||
|
|||
|
Hola a mi si me funciona, te cuento como lo he puesto.
1- He añadido el TestPacthInt3.pas al proyecto 2- Luego, he edité el fuente del proyecto ( Project-> View Source ) 3- Pusé el TestPacthInt3.pas el primero, ya que el por defecto lo puso al final, y quedó asi : program EJEMPLO; uses TestPacthInt3 in 'TestPacthInt3.pas', Forms, [...] Con esto se me solucionó. Espero que te funcione. ![]() |
|
#7
|
|||
|
|||
|
mi problema con esa unidad (TestPacthInt3.pas) es que al compilar el proyecto me da problemas ya que no encuentra un montón de cosas (utilizo delphi 7) y por ejemplono encuentra o reconoce lo siguiente
VER_PLATFORM_WIN32_NT GetModuleHandle('NTDLL.DLL'); GetProcAddress(NTDLL, 'DbgBreakPoint'); con lo cual no puedo meter esa unidad tal cual y hacer lo del proyecto. sabeis por qué puede ser? |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|