如何存储封送处理的数据

How can I store marshaled data?

本文关键字:处理 数据 何存储 存储      更新时间:2023-10-16

我有一个rpc-com接口,它将数据从服务传递到客户端。在客户端,我需要临时存储这些数据,并将其放入队列中,以便稍后在ui线程上处理(这需要在ui线程中完成,因为这是需要创建视图和视图模型对象的地方(。

该结构有点复杂,包含指向其他结构和可变长度字符串的指针。

问题-有没有一种简单的方法可以获取整理后的内存的完整"blob"进行存储,或者我需要复制相同的结构并自己重新打包,以便以后在ui线程上处理它?目前,这看起来像是复制相同的结构,但用CComBSTR等替换LPCWSTR,这对我来说似乎有点肮脏和浪费…

感谢

在您需要理解数据之前,您可以将其视为一个字节序列。你唯一需要知道的就是你有多少数据。然后你可以做一些类似的事情:

std::vector<unint8_t> buf;
buf.resize(length);
memcpy(&buf[0], source, length);

然后在稍后的时间点,假设你的矢量仍然在附近

memcpy(dest, &buf[0], buf.size());

当矢量超出范围时,它将被释放。

唯一可能有点棘手的事情可能是获得长度。这可能需要对发送的数据有一些了解,但除此之外,没有必要对数据进行解包。

您应该在后台线程和UI线程之间封送数据(例如,请参阅CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream(。在线程之间直接传递COM对象是非法的。

使用上面提到的API,您将生成IStream对象并对相应的指针进行排队。然后UI线程将最终恢复指针,调用第二个API,并检索对象的编组副本。

这一切都假设数据一开始就在COM对象中。如果它是COM对象通过连线复制的blob,那么正确的语义规定,当您从COM对象请求数据时,您获得了它的所有权(以及释放/删除它的责任(。然后,只需将指向数据的指针按原样排队,并让UI线程执行释放/删除操作(如何?我不确定;我必须查找它。也许是CoTaskMemFree((?(

如果这是一个更奇怪的场景,请澄清这是什么。