У нас есть * .exe-приложение, которое также не использует COM-сервер.
Основной поток выполняет некоторую сетевую процедуру: он получает пакеты данных и помещает их в очередь.
COM-клиент, например, VBA, использует COM-сервер и тоже хочет использовать очередь. Несмотря на то, что они находятся в одном и том же адресном пространстве, возникает вопрос:
Как мы можем предоставить возможность COM-клиенту использовать очередь одновременно с процессом exe.
Была идея использовать разделяемую память, но безуспешно
UPD:
Я пытался использовать boost :: interprocess.
Из-за того же адресного пространства я хотел просто поделиться указателем объекта.
std::vector<int> //just example of MyType
exe часть:
main()
...
using namespace boost::interprocess;
struct shm_remove
{
shm_remove() { shared_memory_object::remove("SharedMemory"); }
~shm_remove(){ shared_memory_object::remove("SharedMemory"); }
} remover;
managed_shared_memory segment(open_or_create, "SharedMemory", 65536);
std::vector<int>** instance = segment.construct<std::vector<int>* >
("my_instance") //name of the object
(); //ctor first argument
*instance = new std::vector<int>();
(*instance)->push_back(1);
// initialize the COM library
::CoInitialize(NULL);`enter code here`
COM часть:
HRESULT __stdcall CoMyCOMServer::Add(int *value)
{
cout << "Add()\n";
// this line goes out of debug, then VBA get error
managed_shared_memory segment(open_only, "SharedMemory");
std::vector<int>* *res = segment.find<std::vector<int>* > ("my_instance").first;
(*res)->push_back(*value);
return S_OK;
}
COM-клиент (VBA) сообщает
Сбой метода "ADD" объекта "IMyCOMServer"
Dim obj As IMyCOMServer
Set obj = CreateObject("MyCOMServer.object")
obj.Add (2)
UPD2:
Я только что окружил Com part попыткой {} catch {} и обнаружил, что исключение с сообщением «Файл не найден»