Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

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

AlexMPEI (статус: 1-ый класс), 10 февраля 2010, 16:30 [#3]:

Да, спасибо. Почитав интернет я уже понял что моя ошибка была в том что вызов CoInitialize я делал не в методе Execute, а в процедуре инициализации. уже заменил и все заработало.
AlexMPEI

AlexMPEI (статус: 1-ый класс), 10 февраля 2010, 16:33 [#4]:

К сожалению, форум не дает мне изменить репутацию Вадим К в +1. :(
Вадим К

Вадим К (статус: Академик), 10 февраля 2010, 16:45 [#5]:

Но не должен мешать поставить оценку:)
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.02 сек.