Как общаться между частями COM-сервера out-proc * .exe? - PullRequest
2 голосов
/ 19 октября 2011

У нас есть * .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 {} и обнаружил, что исключение с сообщением «Файл не найден»

...