|
Вопрос # 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]:
Но не должен мешать поставить оценку
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|