Dll и TDCOMConnection
У меня проблема следуещего характера. Есть Dll, при вызове функции из которой создается DataModule (вот так: DataModule = new TDataModule((TComponent *)NULL) ), на котором есть компоненты:
TDCOMConnection;
TClientDataSet;
TDataSource.
По идее они должны создатся автоматом?
После создания модуля вызывается функция которая запускает TDCOMConnection но при попытке доступа к нему выдается ошибка: "Не был произведен вызов CoInitialize".
Поготите разобраться, в чем же ошибка?
А дело в следующем. Когда ты создаешь обычное приложение-экзешник с формами, то при использовании COM-объектов, метод CoInitialize автоматически вызывается в Application.Initialize. Ну, а в DLL Application.Initialize не вызывается по-умолчанию и поэтому CoInitialize надо вызывать явно. Тоже самое надо проделать в отдельных неглавных потоках обычного приложения, которые используют COM или OLE механизмы. Если CoInitialize вызывается явно, то при завершении работы потока или DLL надо также вызывать CoUninitialize.
Цитата: brink
Проблему нашел, был немного невнимателен.
А дело в следующем. Когда ты создаешь обычное приложение-экзешник с формами, то при использовании COM-объектов, метод CoInitialize автоматически вызывается в Application.Initialize. Ну, а в DLL Application.Initialize не вызывается по-умолчанию и поэтому CoInitialize надо вызывать явно. Тоже самое надо проделать в отдельных неглавных потоках обычного приложения, которые используют COM или OLE механизмы. Если CoInitialize вызывается явно, то при завершении работы потока или DLL надо также вызывать CoUninitialize.
А дело в следующем. Когда ты создаешь обычное приложение-экзешник с формами, то при использовании COM-объектов, метод CoInitialize автоматически вызывается в Application.Initialize. Ну, а в DLL Application.Initialize не вызывается по-умолчанию и поэтому CoInitialize надо вызывать явно. Тоже самое надо проделать в отдельных неглавных потоках обычного приложения, которые используют COM или OLE механизмы. Если CoInitialize вызывается явно, то при завершении работы потока или DLL надо также вызывать CoUninitialize.
А можно еще помеять TApplication* в длл на TApplication* основного приложения. Должно помочь.
Подмена указателя на TApplication является методом весьма корявым - и кроме того практически не переносимым.
З.Ы. За самостоятельный подход и участие в жизни сообщества - автору респект и повышение репутации.