![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Word`ом в многопоточноми приложении [Delphi, Windows]
Provodnick © (2006-11-07 10:18:00)Здравствуйте! Занчит, ситуация следующая. Есть глобальная переменная WA:variant. Создается отдельный поток BeginThread(nil, 0, @CheckKodif, nil, 0, ThID). В нем создается Word.Application вот так:
try
WA := CreateOleObject('Word.Application')
except
WA:=Null;
Exit
end;
try
WA.Documents.Add(frmMain.edtCodif.Text, EmptyParam)
except
WA.Quit(0, EmptyParam, EmptyParam);
WA:=Null;
Exit
end;
Во-первых, все это не работало, пока в начало функции потока не добавил CoInitialize(nil) - почему?
И второе - хотя переменная WA и глобальна, но после отработки потока Word через нее становится недоступен в основном потоке программы. Пишет "Объект не подключен к серверу". Помоги пожалуйста разобраться!
Provodnick (2006-11-07 11:25:00) [1]Да, я почитал MSDN - разобрался. Использование COM-объекта в разных потоках допустимо при Multithreaded Apartment Model. Спасибо.
Сергей М. (2006-11-07 11:08:00) [2]
> пока в начало функции потока не добавил CoInitialize(nil)
> - почему?
Потому что
The CoInitialize function initializes the Component Object Model(COM) library. You mustinitialize the library before you can call its functions. Applications mustcall CoInitialize before they make any other COM library
..
You needto call this before you call any of the OLE library functions unless you call the OleInitialize function, which calls CoInitialize internally
> после отработки потока Word через нее становится недоступен
> в основном потоке программы
Все правильно, так и должно быть.
Каждый поток должен создавать свой собственный экз-р объекта олей-автоматизации. Создание оного объекта в одном потоке и последующее использование его в других потоках недопустимо.