DCOM многопоточность
DCOM, установил параметры на закладке Project->Options->ATL) с параметрами:
Instancing: Multiple use (потому что это должно означать, что несколько клиентов одновременно могут работать с сервером)
OLE Initialization COINIT_xxxx Flag: APARTMENTTHREADED
(есть ещё MULTITHREADED, но этот вариант должен означать, что для каждого клиента создается его собственный экземпляр объекта сервера)
Threading Model: Free (потому что каждый клиент может создавать множество потоков, каждый из которых должен уметь работать с клиентским экземпляром сервера)
Действительно, если я создаю 2 клиента, каждый из них работает со своим экземпляром сервера, но вот если я в клиенте создаю второй поток, который пытается "дернуть" метод сервера, HRESULT возвращает "CO_E_NOTINITIALIZED".
Как быть? Как надо расставить флаги (при создании нового проекта, или в уже имеющемся), чтобы каждый клиент (процесс) цепляющийся к серверу получал свой экземпляр объекта сервера, но клиенты могли дергать методы своего экземпляра из разных потоков?
http://www.podgoretsky.com/ftp/Docs/Delphi/DX/COMmodel.html
очень неплохо рассказывает, что к чему, но мне всё равно нужна помощь специалиста =(
Захожу в Билдер. Создаю новый Application. Добавляю в него Automation Object. Устанавливаю ему Threading model: Free. Даю ему пару методов.
Делаю клиент, обращающийся к нему. Всё компилится. Работает. Создаю у клиента второй поток - методы не дергаются. Возвращает ошибку "CO_E_NOTINITIALIZED". Понятно, добавляю CoInitialize(NULL) в начало и в конце CoUninitialize(). Возвращает ошибку RPC_E_WRONG_THREAD.
Точно так же себя ведет, если я создаю сервер с Threading model: Apartment.
Что я делаю не так? :(
Интернет предлагает добавлять методы CoMarshalInterThreadInterfaceInStream и обратный, которые я вообще не понимаю, кроме того, на этом форуме они поиском вообще не находятся. Как быть? :(