2012-08-28 4 views
4

я естькак отладить процесс регистрации 64-битной dll, выполненный с помощью regsvr32.exe?

времени Run Error 216 по адресу

при регистрации 64 битную DLL построен с Delphi XE2 (я имею Update 3).

из командной строки я делаю (примечание: папка system32 содержит 64-битный ех!)

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

и после «длл успешно установлено сообщения» у меня есть сообщение об ошибке выполнения.

Я хотел бы отладить процесс регистрации, как-то используя Run/Parameters/host.

Не могли бы вы отправить правильную процедуру? В некоторых других вопросах, таких как this one упоминается ошибка, но это seems fixed now, у меня есть сборка delphi старше этого.

Обновление: Также любые комментарии к ошибке RunTime приветствуются.

+1

216 - это нарушение доступа в разделе инициализации перед инициализацией SysUtils, а 217 - в секции финализации после завершения работы SysUtils. –

+0

@Marjan Вы правы насчет 216. Но не о 217. Взгляните в System.pas. 217 - 'reControlBreak'. И 'MapToRunError' отображает' STATUS_CONTROL_C_EXIT', aka 'C000013A' на' reControlBreak'. –

+0

@DavidHeffernan: спасибо за проверку. Я был уверен, что видел 217, созданный кодеком AV, хотя и в D5. На самом деле, по-прежнему можно получить 217 на AV после завершения SysUtils, так как 217 используется (hardcodedly) в '_UnhandledException' под условным определением' TABLE_BASED_EXCEPTIONS'. То есть в XE2. Старые версии, возможно, использовали 217 в большем количестве случаев. И действительно, в D2006it используется (hardcodedly) в '_ExceptionHandler', предполагая, что 217 может быть сообщено для любого исключения ol. –

ответ

5
  1. Загрузить проект DLL.
  2. Изменить параметры запуска (Запустить | Параметры), чтобы указать хост-приложение как regsvr32. Обратите внимание, что вам может понадобиться использовать C: \ Windows \ sysnative путь, чтобы победить 32-битный файловый редиректор.
  3. Включить путь к DLL как аргументы командной строки.
  4. Возможно включить Debug DCU, если ошибка возникла в коде саморегистрации Delphi COM.

enter image description here

Затем отладить DLL, как и любой другой DLL.

Ошибка выполнения 216 - нарушение прав доступа.

1

1) эта ошибка времени выполнения может быть просто выходом программы. Например, вы отлаживаете внутренности DllMain, вы можете легко пройти мимо точки выхода и попытаться отследить завершенную DLL, которая будет через RE. Выход процесса выглядит не так, как возврат из подпрограммы, а скорее как вызов специальной функции API системы. Но отладчик не понимает этого и продолжает отслеживать теперь мертвый проект.

2) Я не вижу смысла использовать RegSvr32.exe или TRegSvr.exe для отладки. Все RegSvr32 это вызов предопределенной функции из DLL. Вы отлаживаете свою DLL или RegSvr32?

2.1) Если последнее - я слышал, что есть источники RegSvr32, и, вероятно, есть символы отладки, но некоторые отладчики Microsoft, которые будут использоваться.

2.2) Если прежний, тогда должна быть разница в том, как вызывать эти функции, и вам нужно только отлаживать эти функции. Просто возьмите любой код от File not found when registering DLL with TFileRun and regsvr32 и используйте его как хост.

+0

Вы используете 'regsvr32' в качестве хоста DLL, чтобы получить что-то, чтобы загрузить вашу DLL и вызвать соответствующую функцию. Вы можете сделать это по-другому, но, скорее всего, это сделать быстрее. Почему использование другого хоста упрощает работу? Совершенно очевидно, что regsvr32 не требует отладки, поэтому 2.1 можно очистить. –

+0

Да, это упростит ситуацию - yow будет иметь отладочную информацию для вашей программы и сможет определить точный момент возврата из DLL и остановиться там, а не запустить весь хост до RunTime Error. * Надеюсь, вы даже сможете отлаживать его, как EXE, вызывающий DLL, а не как DLL, вызванный blackbox EXE * –