我有一个rpc com接口,可以将数据从服务传递到客户端。在客户端,我需要暂时存储这些数据并将其放入队列中,以便以后可以在ui线程上处理(这需要在ui线程上完成,因为这是视图和视图模型对象需要的地方)待创造。)
结构有点复杂,包含指向其他结构和可变长度字符串的指针。
问题 - 是否有一种简单的方法可以获取封装内存的完整“blob”用于存放或者我是否需要复制相同的结构并自行重新打包以便以后可以在ui线程上处理它?目前这看起来像复制相同的结构,但用CComBSTR等代替LPCWSTR,这对我来说似乎有些肮脏和浪费......
由于
答案 0 :(得分:0)
在您需要了解数据之前,您可以将其视为一个字节序列。您需要知道的唯一事情就是您拥有多少数据。然后你可以做类似的事情:
std::vector<unint8_t> buf;
buf.resize(length);
memcpy(&buf[0], source, length);
然后在稍后的某个时间点,假设你的矢量仍在
memcpy(dest, &buf[0], buf.size());
当矢量超出范围时,它将被释放。
唯一可能有点棘手的可能是获得长度。这可能需要了解所发送数据的一些知识,否则无需解压缩数据。
答案 1 :(得分:0)
您应该在后台线程和UI线程之间封送数据(例如,请参阅CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream)。直接在线程之间传递COM对象是非法的。
使用上面提到的API,您将生成IStream
对象并对相应的指针进行排队。然后UI线程最终将恢复指针,调用第二个API,并检索该对象的编组副本。
所有这些都假定数据是在COM对象中开始的。如果它是由COM对象通过线路复制的blob,那么正确的语义要求当您从COM对象请求数据时,您获得了它的所有权(以及释放/删除它的责任)。然后只是按顺序排列指向数据的指针,并让UI线程执行释放/删除(如何?我不确定;我必须查找它。也许是CoTaskMemFree()?)
如果这是一个更离奇的场景,请澄清它是什么。