| 
| 
 | Вопрос # 3 753/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!в программе создаю Thread. В нем делаю
 mcp := CreateOleObject('WinCC-Runtime-Project');
 далее в процессе работы потока происходит вызов
 Result := mcp.GetValue(strTagNam);
 при этом возникает ошибка
 ---------------------------
 Debugger Exception Notification
 ---------------------------
 Project WinCCserverProject.exe raised exception class EOleSysError with message 'Не был произведен вызов CoInitialize'. Process stopped. Use Step or Run to continue.
 ---------------------------
 OK   Help
 ---------------------------
 Хотя в процедуре инициализации потока я вызываю CoInitialize(nil); и уже после этого вызываю функцию в которой происходит создание ОЛЕ-объекта  (mcp := CreateOleObject('WinCC-Runtime-Project');).
 В чем тут может быть дело?
 
|  |   Вопрос задал: AlexMPEI (статус: 1-ый класс)Вопрос отправлен: 10 февраля 2010, 14:09
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, AlexMPEI!А процедура инициализации потока выполняется не в самом потоке...
 вызов CoInitialize должен быть в самом потоке. например в самом начале метода Execute.
 
 Ну и конечно в конце работы потока неплохо вызвать CoUninitialize - что бы всё корректно освободилось.
 
 Для развития почитайте здесь http://www.delphikingdom.com/asp/listerrors.asp?ID=62 и здесь http://podgoretsky.com/ftp/Docs/Delphi/DX/COMmodel.html
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 10 февраля 2010, 16:20
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 5; последнее сообщение — 10 февраля 2010, 16:45; участников в обсуждении: 2. 
|   | AlexMPEI (статус: 1-ый класс), 10 февраля 2010, 16:18 [#1]:в другом случае, если я вставляю CoInitialize и CoUnInitialize до и после обращения к объекту: Result := mcp.GetValue(strTagNam); то получаю на строке обращения ошибку:
 
 ---------------------------
 Debugger Exception Notification
 ---------------------------
 Project WinCCserverProject.exe raised exception class EOleSysError with message 'Приложение обратилось к интерфейсу, относящемуся к другому потоку'. Process stopped. Use Step or Run to continue.
 ---------------------------
 OK   Help
 ---------------------------
 |  
|   | Вадим К (статус: Академик), 10 февраля 2010, 16:22 [#2]:а, так это ещё веселее дело в том, что надо делать синхронизацию. нельзя так просто с одного потока вызывать методы объектов созданных в другом. возможны самые разнообразные спецэффекты.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | AlexMPEI (статус: 1-ый класс), 10 февраля 2010, 16:30 [#3]:Да, спасибо. Почитав интернет я уже понял что моя ошибка была в том что вызов CoInitialize я делал не в методе Execute, а в процедуре инициализации. уже заменил и все заработало. |  
|   | AlexMPEI (статус: 1-ый класс), 10 февраля 2010, 16:33 [#4]:К сожалению, форум не дает мне изменить репутацию Вадим К в +1.   |  
|   | Вадим К (статус: Академик), 10 февраля 2010, 16:45 [#5]:Но не должен мешать поставить оценку   Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |