我们有 *.exe 应用程序,它也是进程外 COM 服务器。
主线程正在执行一些网络例程:它接收数据包并将它们放入队列。
COM 客户端,例如 VBA,使用 COM 服务器,也想使用队列。尽管它们在同一个地址空间中,但问题是:
我们如何为 COM 客户端提供一个机会,让他们可以与 exe 进程同时使用队列。
有一个使用共享内存的想法,但没有成功
升级版:
我尝试使用 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)告诉
对象“IMyCOMServer”的方法“ADD”失败
Dim obj As IMyCOMServer
Set obj = CreateObject("MyCOMServer.object")
obj.Add (2)
UPD2:
我刚刚用 try{}catch{} 包围了 Com 部分,发现异常消息“找不到文件”