¿Cómo depurar un proceso de registro de DLL de 64 bits realizado con regsvr32.exe?

yo tengo

Error de tiempo de ejecución 216 en la DIRECCIÓN

al registrar un dll de 64 bits creado con Delphi XE2 (tengo la Actualización 3).

desde el símbolo del sistema, lo hago (nota: ¡la carpeta system32 contiene el exe de 64 bits!)

c:\windows\system32\regsvr32.exe My64bitdll.dll

y después de un "mensaje de dll instalado con éxito" tengo el error de tiempo de ejecución.

Me gustaría depurar el proceso de registro, de alguna manera usando Run/Parameters/host.

¿Alguien podría publicar el procedimiento correcto? En algunas otras preguntas como esta se menciona un error, pero parece arreglado ahora, tengo una compilación de delphi más antigua que esta.

Actualizar: También cualquier comentario sobre el error RunTime es bienvenido.

preguntado el 28 de agosto de 12 a las 12:08

216 es una infracción de acceso en una sección de inicialización antes de que se haya inicializado SysUtils, 217 es lo mismo en una sección de finalización después de que se haya finalizado SysUtils. -

@Marjan Tiene razón sobre 216. Pero no sobre 217. Eche un vistazo a System.pas. 217 es reControlBreak. Y MapToRunError mapas STATUS_CONTROL_C_EXIT, Aka C000013A sobre reControlBreak. -

@DavidHeffernan: gracias por verificar. Estaba un poco seguro de haber visto 217 producido por código AV, aunque en D5. En realidad, todavía es posible obtener un 217 en un AV después de la finalización de SysUtils, ya que 217 se usa (codificado) dentro _UnhandledException lo de abajo TABLE_BASED_EXCEPTIONS definición condicional. Eso es en XE2. Las versiones anteriores pueden haber usado 217 en más circunstancias. Y, de hecho, en D2006 se usa (codificado de forma rígida) en un _ExceptionHandler, lo que sugiere que se pueden haber informado 217 para cualquier excepción anterior. -

@MarjanVenema Obtiene 217 para una excepción no controlada tanto en excepciones basadas en pila (32 bits) como en excepciones basadas en tablas (64 bits). En 32 bits que surge en _ExceptionHandler if ExceptProc is nil. Y hay un código similar para 64 bits. Entonces, en realidad, cualquier excepción al final del apagado, después DoneExceptions se llama resultados en 217. Así que supongo que eso significa que tu comentario es correcto. -

2 Respuestas

  1. Cargue el proyecto DLL.
  2. Modificar parámetros de ejecución (Ejecutar | parámetros) para especificar la aplicación host como regsvr32. Tenga en cuenta que es posible que deba usar la ruta C:\Windows\sysnative para anular el redirector del sistema de archivos de 32 bits.
  3. Incluya la ruta a DLL como argumentos de línea de comando.
  4. Tal vez habilite Depurar DCU, en caso de que el error aparezca en el código de autorregistro COM de Delphi.

enter image description here

Luego depure la DLL como cualquier otra DLL.

El error de tiempo de ejecución 216 es una infracción de acceso.

Respondido 28 ago 12, 13:08

1) este error de tiempo de ejecución puede ser solo la salida del programa. Por ejemplo, si depuraría los componentes internos de DllMain, puede pasar fácilmente el punto de salida e intentar rastrear la DLL finalizada, lo que lo haría a través de RE. La salida del proceso no se ve como un retorno de la subrutina, sino más bien como una llamada a la función especial de la API del sistema. Pero el depurador no lo entiende y continúa rastreando el proyecto ahora muerto.

2) No veo el punto de usar RegSvr32.exe o TRegSvr.exe para la depuración. Todo lo que hace RegSvr32 es llamar a la función predefinida desde DLL. ¿Depuras tu DLL o RegSvr32?

2.1) Si es lo último: escuché que hay fuentes de RegSvr32, y probablemente hay símbolos de depuración, pero se debe usar algún depurador de Microsoft.

2.2) Si era anterior, ahora debería haber una diferencia en cómo llamar a esas funciones y solo tiene que depurar esas funciones. Simplemente tome cualquier código de Archivo no encontrado al registrar DLL con TFileRun y ​​regsvr32 y usarlo como host.

contestado el 23 de mayo de 17 a las 13:05

Tu usas regsvr32 como host de DLL para obtener algo para cargar su DLL y llamar a la función apropiada. Puedes hacerlo de otra manera, pero probablemente sea más rápido hacerlo de esa manera. ¿Por qué el uso de un host diferente simplificaría las cosas? Es bastante obvio que regsvr32 no necesita depuración, por lo que 2.1 se puede borrar. - David Heffernan

Sí, eso simplificaría las cosas: tendría información de depuración para su programa y podría determinar el momento exacto de regresar de DLL y detenerse allí, sin ejecutar todo el host hasta RunTime Error. Con suerte, incluso podría depurarlo como EXE llamando a DLL, no como DLL llamado por blackbox EXE - Arioch 'El

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.