Delphi - проблема блокировки загрузчика ОС, внезапно появляющаяся в Excel
Я работаю над плагином Delphi для Excel. Он также использует библиотеку AddIn Express COM (отличная BTW). Код работал нормально. Я добавил еще одну опцию меню ленты, которая вызывает новую форму. Эта форма имеет элементы управления REST (Клиент, Ответ и т. Д.). Хотя компоненты связаны друг с другом, у них нет информации об URL-адресах. Это устанавливается во время выполнения. Я компилирую свой проект.
- Если я запускаю его автономно (вне отладчика), он работает нормально. Он устанавливает ресурсы URL, вызывает службу REST и отображает данные в заметке.
- Если я запускаю его из Delphi, меня сразу же сбрасывают в код сборки, и я получаю сообщение об ошибке в журнале событий.
"Попытка управляемого исполнения внутри OS Loader Lock. Не пытайтесь запускать управляемый код внутри функции инициализации DllMain или изображения, так как это может привести к зависанию приложения ".
Раньше это нормально работало, но я только что добавил форму (в частности, я добавил родительскую форму с компонентами REST, RestAdapter, TDatasource и ClientDataSet и унаследовал от нее). В Googling кажется, что это проблема отладчика, и что (по крайней мере, в Visual Studio) ее можно отключить с помощью Exceptions / Ignore Loader Lock. Я не могу найти аналогичные функции в отладчике Delphi (Сиэтл).
Я запускал AddIn Express без проблем, мой плагин работал без проблем, и я запускал автономные демонстрационные приложения REST без проблем. Возможно ли, что комбинация вызывает эту проблему? Есть идеи, как отключить проверку отладчика на Loader Lock? Если это помогает, последнее сообщение ДО сообщения "Блокировка загрузчика ОС" в журнале событий показывает, что модуль: CSCAPI.dll был загружен. Мне интересно, если мне нужно динамически создавать компоненты REST. Я подозреваю, что эти компоненты создаются при запуске приложения (например, Excel с моим плагином), и что-то инициализируется таким образом, что расстраивает отладчик...
2 ответа
Я наконец решил, что происходит. Я купил и установил другой плагин Excel. Это было то, что вызывало мою проблему. По-видимому, он использует код в своей процедуре инициализации, которая стала причиной моей проблемы. Как только я установил этот плагин на неактивный, мой код работает нормально. Это не было проблемой с компонентами REST вообще.
Вероятное объяснение состоит в том, что какой-то код в одном из ваших initialization
подразделения несут ответственность. Этот код вызывается из DllMain
функция. Попытка управляемого выполнения из DllMain
действительно напрашивается на неприятности.
В моем модуле AddInExpress все initialization
разделы пусты. Любая инициализация выполняется в другом месте. Я знаю, что это будет расстраивать, но вы действительно не должны делать ничего отдаленно сложного в вашем DllMain
,
Я предлагаю ваш следующий шаг, чтобы удалить код, пока вы не найдете, какой initialization
раздел отвечает. Обратите внимание, что за это могут отвечать любые модули в вашем проекте, даже код библиотеки Embarcadero, такой как используемые вами REST-компоненты Embarcadero. Это ваша отправная точка. Что касается решения, хорошо учтите, что как только вы изолировали проблему.