powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование OLE в отдельном потоке
12 сообщений из 37, страница 2 из 2
Использование OLE в отдельном потоке
    #40119316
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__XeNoNx8000__Всё сделал по документациям.

Невозможно сделать "всё по документации" если ты документацию не читал. А ты её
не читал, судя по незнанию даже того, что CoInitialize должен вызываться в
каждом потоке отдельно, а в главном это делается автоматически секцией
initialization соответствующего модуля.

Метод Show наводит на мысль, что у твоего сервера есть окна, а их создание и
использование в фоновых потоках имеет свою специфику (в основном заключающуюся в
том, что последующий цикл выборки сообщений должен работать в том же потоке).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование OLE в отдельном потоке
    #40119329
__XeNoNx8000__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, это как пальцем в небо. Что я сделал не так?
...
Рейтинг: 0 / 0
Использование OLE в отдельном потоке
    #40119354
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__XeNoNx8000__Что я сделал не так?

Как тебе уже и сказали: с чего-то решил, что данный конкретный OLE сервер может
использоваться из отдельного потока.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование OLE в отдельном потоке
    #40119379
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__XeNoNx8000__,

https://www.sql.ru/forum/1331355/createcomobject-in-thread?hl=coinitializeex%5D%D1%82%D1%83%D1%82]https://www.sql.ru/forum/1331355/createcomobject-in-thread?hl=coinitializeex]тут посмотри может поможет
...
Рейтинг: 0 / 0
Использование OLE в отдельном потоке
    #40119398
__XeNoNx8000__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программа лежит не на системном диске. MS Office 2016, ничего из офиса не запущено, сервисы синхронизации и его облаков отключены. Windows 10 (19043.1387). Антивирусов нет, защитник отключён.

С моим кодом при запуске даже от имени администратора выдаёт сначала "ошибку при выполнении приложения-сервера", при этом кнопки в приложении подсвечиваются под курсором, но на нажатия не реагируют. При попытке закрыть по системной кнопке вылезает EOSError Code: 5 Отказано в доступе. Жму ОК - ошибка закрывается, приложение так же не реагирует на нажатия кнопок, но ошибок нет. Приходится убивать процесс.
...
Рейтинг: 0 / 0
Использование OLE в отдельном потоке
    #40119404
__XeNoNx8000__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С LibreOffice код работает...
...
Рейтинг: 0 / 0
Использование OLE в отдельном потоке
    #40119405
__XeNoNx8000__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Word.Application не работает, Excel.Application работает. При этом программа после запуска потока уже не отвечает на нажатия кнопок.
...
Рейтинг: 0 / 0
Использование OLE в отдельном потоке
    #40119408
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__XeNoNx8000__
При этом программа после запуска потока уже не отвечает на нажатия кнопок.

И в этом нет ничего удивительного, ведь вы сами указываете при создании потока MainForm.Lock....
...
Рейтинг: 0 / 0
Использование OLE в отдельном потоке
    #40119409
__XeNoNx8000__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45, это только отключает кнопки и поля ввода, поэтому даже без неё форма не реагирует.

Если использовать GetActiveOleObject, то при её выполнении появляется ошибка "операция недоступна", а затем нормально отрабатывается CreateOleObject. Правда, тогда поток завершается нормально, но программа всё равно не закрывается. Ну и новая ошибка после выполнения потока:

Код: pascal
1.
2.
3.
4.
Debug Output:
onecore\com\combase\dcomrem\call.cxx(4907)\combase.dll!764974A5: (caller: 7651D948) ReturnHr(1) tid(dec) 800706BA Сервер RPC недоступен.

Process Project1.exe (9180)
...
Рейтинг: 0 / 0
Использование OLE в отдельном потоке
    #40119411
__XeNoNx8000__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кажется, нашёл ошибку. Но всё равно ничего не понимаю. Если добавить GetActiveOleObject - всё работает как надо. То есть я не могу создать ещё один ole-объект, и должен использовать тот, который подгружен? Или как это работает?

При этом ошибка доступа показывалась, если я правильно понял, из-за сообщения о завершении: оно показывалось на модальной форме, которая создавалась в потоке. Так как он не ждал её закрытия, главная форма оставалась неактивной из-за того, что не получала ответа от потерянной из-за завершения потока формы.
...
Рейтинг: 0 / 0
Использование OLE в отдельном потоке
    #40119421
__XeNoNx8000__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя модальная форма создаётся через CreateMessageDialog, а он привязывается к приложению, а не к потоку...

upd: решил через ForceQueue.
...
Рейтинг: 0 / 0
Использование OLE в отдельном потоке
    #40119426
__XeNoNx8000__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  TTask.Run(
    procedure
    var w, t: OleVariant;
    begin
      try
        CoInitializeEx(nil, COINIT_MULTITHREADED);

        try
          w := GetActiveOleObject({some ole obj});
        except
          try
            w := CreateOleObject({same ole obj});

            {working with `w`}

            w.Quit;

            TThread.ForceQueue(nil, procedure begin {some OK modal message} end);
          except
            TThread.ForceQueue(nil, procedure begin {some ERROR modal message} end);
          end;
        end;
      finally
        w := Unassigned;
        CoUninitialize();
      end;
    end
  );
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование OLE в отдельном потоке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]