gpt4 book ai didi

c++ - Delphi 中的 TClientDataSet.LoadFromStream() 中的 "Error creating variant or safe array"

转载 作者:可可西里 更新时间:2023-11-01 02:53:51 25 4
gpt4 key购买 nike

我有一个客户端-服务器应用程序。客户端(TCP Client)是一个Delphi应用程序,它向服务器(TCP Server,C++ Builder应用程序)发送命令。
它们都是用 Rad Studio XE2 编写的。
服务器响应命令,从 SQL Server 获取数据并将其发送到客户端。
服务器使用TClientDataSet并将其保存到发送给客户端的TMemoryStream
客户端还使用 TClientDataSet 并对从服务器接收的流调用 TClientDataSet.LoadFromStream()
这很好用。
但有一种情况是数据大小较大(~160 MB),有时会在调用 TClientDataSet.LoadFromStream() 时抛出 "Error creating variant or safe array"> 在客户端。

服务器通过这种方式向客户端发送流:

//...
FContext->Connection->IOHandler->LargeStream = true;
FContext->Connection->IOHandler->Write(Stream, 0, true);

客户端是这样接收的:

AClient.IOHandler.LargeStream := True;
AClient.IOHandler.ReadStream(Stream, -1, False);

客户端收到后,将流的位置改为18。
因为实际数据是在 18 字节之后开始的。然后调用 TClientDataSet.LoadFromStream()

//...
MemTable.LoadFromStream(Stream);

LoadFromStream() 抛出“创建变体或安全数组时出错”。但在某些情况下它可以正常工作。

有人知道吗?

最佳答案

根据 Delphi 10 的源代码,问题来自 SafeArrayCreate 失败,很可能是因为 EOutOfMemory 异常。

SafeArrayCreate 尝试分配 160MB 的内存,这需要是连续的。进程的虚拟内存中可能没有足够大的“洞”来容纳那么多内存。在 32 位进程中,我猜这不太可能。

稍微缓解此问题的一种方法可能是激活/LARGEADDRESSAWARE 标志。但这只会稍微降低错误发生的可能性,并可能在未来很快再次出现。

其他选项包括:

  • 编译为 64 位应用程序。

  • 使用适当的数据库而不是内存中的数据集。

关于c++ - Delphi 中的 TClientDataSet.LoadFromStream() 中的 "Error creating variant or safe array",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41616773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com