#delphi #ado
#delphi #ado
Вопрос:
У нас есть текущий продукт, написанный на Delphi 6 websnap, который я пытаюсь обновить для запуска под управлением delphi 2005. Он использует ADO, и при запуске возникает ошибка «Совместная инициализация не была вызвана». Единственные ссылки, которые я могу найти на эту ошибку, указывают на IntraWeb и что-то под названием ServerController, что, я не уверен, имеет отношение ко мне. Любое количество вызовов CoInitialize (nil) не имеет никакого эффекта.
Я трачу свое время на запуск этого, или это возможно запустить в 2005 году — или для этого подойдет более поздняя версия?
Ответ №1:
CoInitialize
необходимо вызвать в потоке, который выполняет COM-доступ (например, в любом потоке, который обращается к вашей базе данных через ADO). По умолчанию Delphi вызывает его в главном потоке, но вам нужно явно вызывать его в других потоках.
Попробуйте вызвать его в OnActivate
событии и вызывайте CoUninitialize
в OnDeactivate
событии.
Также убедитесь, что ваши ADOTables и ADOConnections не открыты во время разработки. В противном случае приложение попытается использовать COM до вашего вызова CoInitialize
.
Если все остальное не удается — попробуйте переопределить конструктор веб-формы и вставьте CoInitialize
туда перед вызовом inherited. Не забудьте вызвать CoUninitialize
деструктор.
Комментарии:
1. Спасибо за ответ, но я не уверен, что представляет собой поток в websnap. Я пробовал совместную инициализацию в различных событиях активации, но выполнение, похоже, не достигает их. Также попробовал раздел инициализации, который запускается, но не помогает.
2. 1 за ответ Стива, но вы могли бы создать простой модуль инициализации COM и поместить его в качестве первого модуля в предложении исходного кода вашего проекта uses. Поместите CoInitialize в раздел инициализации, а CoUninitialize — в раздел завершения.
3. Спасибо, Стюарт, но я уже эффективно пробовал это. Я могу пошагово просматривать строки кода, которые вызывают CoInit, приложение запускается. Когда я захожу на веб-страницу в первый раз, она выдает ошибку. Даже если я перейду с помощью F7, я не увижу ничего из своего собственного кода. Итак, я думаю, вопрос в том, может ли WebSnap вообще работать с delphi 2005 и ADO?
4. @Petebr — вы подключили обработчик событий к вашему PageModule. При активации ничего не происходит?
5. Исправлено. Я установил CoInit и точки останова на главной странице (WebAppPageModule) и моем модуле данных (TWebDataModule) в разделах onCreate, OnActivate и initialization, и когда-либо достигался только раздел init. Поискал открытые наборы данных по всему проекту, но ничего не открывается до получения первого запроса, но этот код так и не был достигнут.