アウトプロセス COM サーバーでもある *.exe アプリケーションがあります。
メイン スレッドは何らかのネットワーク ルーチンを実行しています。つまり、データ パケットを受信してキューに入れます。
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:
Com 部分を try{}catch{} で囲んだところ、「ファイルが見つかりません」というメッセージの例外が発生したことがわかりました。