- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用 TComInterface
最佳答案
一种方法是Read()
IStream
将数据存入缓冲区,然后 Write()
到TMemoryStream
,例如:
TComInterface<IStream> pIStrm;
TMemoryStream *pMStrm;
...
STATSTG stat = {0};
OleCheck(pIStrm->Stat(&stat, STATFLAG_NONAME));
LARGE_INTEGER li;
li.QuadPart = 0;
ULARGE_INTEGER ul;
OleCheck(pIStrm->Seek(li, STREAM_SEEK_CUR, &ul));
unsigned __int64 ulPos = ul.QuadPart;
BYTE buffer[1024];
while (ulPos < stat.cbSize.QuadPart)
{
ULONG ulRead;
OleCheck(pIStrm->Read(buffer, min(stat.cbSize.QuadPart - ulPos, sizeof(buffer)), &ulRead));
pMStrm->WriteBuffer(buffer, ulRead);
ulPos += ulRead;
}
...
另一个选择是写 TStream
- 访问 IStream
的派生类内部(类似于 RTL 的 TStreamAdapter
类如何包装 TStream
因此它可以作为 IStream
传递),例如:
class TIStreamWrapper : public TStream
{
private:
TComInterface<IStream> pIStrm;
protected:
virtual __int64 __fastcall GetSize();
virtual void __fastcall SetSize(const __int64 NewSize);
public:
__fastcall TIStreamWrapper(IStream *Strm);
virtual int __fastcall Read(void *Buffer, int Count);
virtual int __fastcall Write(const void *Buffer, int Count);
virtual __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin);
};
__fastcall TIStreamWrapper::TIStreamWrapper(IStream *Strm)
: pIStrm(Strm, true)
{
}
__int64 __fastcall TIStreamWrapper::GetSize()
{
STATSTG stat = {0};
OleCheck(pIStrm->Stat(&stat, STATFLAG_NONAME));
return stat.cbSize.QuadPart;
}
void __fastcall TIStreamWrapper::SetSize(const __int64 NewSize)
{
ULARGE_INTEGER ul;
ul.QuadPart = NewSize;
OleCheck(pIStrm->SetSize(ul));
}
int __fastcall TIStreamWrapper::Read(void *Buffer, int Count)
{
ULONG ulRead;
OleCheck(pIStrm->Read(Buffer, Count, &ulRead));
return ulRead;
}
int __fastcall TIStreamWrapper::Write(const void *Buffer, int Count)
{
ULONG ulWritten;
OleCheck(pIStrm->Write(Buffer, Count, &ulWritten));
return ulWritten;
}
static const DWORD IStreamSeekOrigin[] = {STREAM_SEEK_SET, STREAM_SEEK_CUR, STREAM_SEEK_END};
__int64 __fastcall TIStreamWrapper::Seek(const __int64 Offset, TSeekOrigin Origin)
{
LARGE_INTEGER li;
li.QuadPart = Offset;
ULARGE_INTEGER ul;
OleCheck(pIStrm->Seek(li, IStreamSeekOrigin[Origin], &ul));
return ul.QuadPart;
}
TComInterface<IStream> pIStrm;
TMemoryStream *pMStrm;
...
TIStreamWrapper *pWrapper = new TIStreamWrapper(pIStrm);
try
{
pMStrm->LoadFromStream(pWrapper);
// or: pMStrm->CopyFrom(pWrapper, 0);
}
__finally
{
delete pWrapper;
}
...
关于delphi - 如何将 IStream 加载到 TMemoryStream 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15441014/
我在这里阅读了很多关于将字符串写入 TMemoryStream 并保存到文件并将字符串读回 TMemoryStream 的讨论 我不知道我在这里做错了什么,但我的 SaveData 或 LoadDat
我尝试将加载到Memorystream中的前16个字节读取为TBytes。此ReadBuffer methot引发访问冲突异常。 我想从文件中加载加密的数据。前16个字节是用于创建文件的密码的MD5哈
我想做的就是使用 TSockets 发送一个流,但遇到“内存不足”错误。我成功发送了文件,但没有发送图像。在服务器表单的 OnCreate 事件中,我正在创建流。对于客户端,在表单的 OnCreate
如何将 TMemoryStream 的内容转换为变体?我使用Delphi 2010。 TMemoryStream存储文件的内容,可以是PDF或JPG(扫描文档)。 文件保存在 MS SQL 库中。当我
我正在使用 D6 Professional,需要从内存中已有的大量小字符串创建特定格式的文本文件。出于性能考虑,我正在考虑使用 TMemoryStream 来整理文件数据,然后通过 TFileStre
我正在delphi(RAD Studio)创建一个项目。数据库表中的某些行存储有图像。我想在运行时提取图像(为此我使用 TMemoryStream 数组)并在 frxReport 中显示它们。 我的代
这是我关于 SO 的第二个问题,我希望我的格式正确。 我在工作中发现 TFileStream 比 TMemoryStream 慢,我真的不知道为什么会这样。因此我决定做一些测试。 在我发现这种行为的应
以下函数采用 Richedit 中的选定文本控制,写入 TMemoryStream在回调函数内,然后以纯文本字符串形式返回原始 rtf 代码。 var MS: TMemoryStream; //
我有一些 Delphi 代码需要转换为 Qt/C++。 整体代码读取二进制数据文件,并提取部分数据。 Delphi代码读取文件内容如下: var m1 tmemorystream; h1
我正在尝试将 TMemoryStream 缓冲区的内容复制到 void 指针,下面您可以看到不起作用的示例代码 - void 缓冲区为空,但文本框包含有效大小 - 我用 winrar 大小检查了它。以
我正在尝试使用这样的简单代码行读取 bool 值:ReadBuffer(Result, 1)。 阅读后,结果为真。然而 Result:= not Result 不会“切换”值 false。 我在这里显
如何使用 TComInterface 对象并将其读入 TMemoryStream?我可以采用 TComInterface 并将其用作 TStream* 以某种方式使用 TMemoryStream Lo
如何通过datasnap与TMemoryStream传输TObject? TMyObject = class(TBizObject) FText: TMemoryStream; bytes t
我正在编写并行代码来枚举大量 CSV 文件,每个文件都包含历史股票数据(超过 6500 个代码),并计算每只股票是否已达到历史最高点。 我已经实现了一个线程池和 TThread 后代类,以在线程之间平
我在 XE2 中找到了 Remy Lebeau 的 IdTCP 组件的聊天演示,我想玩一下。 (可以找到 here )我想使用这些组件发送图片,最好的方法似乎是使用 TMemoryStream。如果我
我需要对 TTreeView 的树的 Unicode 字符串做一些事情,所以我想将此字符串加载到内存流中,然后将内存流加载到 TreeView 中。我怎样才能做到这一点? 最佳答案 您很想直接使用 T
在 Delphi 2009 之前我们有以下代码: function MemoryStreamToString(M : TMemoryStream): String; var NewCapaci
我有一个方法可以读取TStringGrid行的单元格中的数据,并将其复制到剪贴板。我有一个相应的方法将剪贴板中的数据粘贴到 TStringGrid 中的空行中。 这些方法是为 D7 编写的,但在迁移到
使用 Delphi Tokyo 10.2.3 并针对 Android,我正在创建多个线程来下载 PNG 图像并在后台对其进行解码。 由于这里解释的稳定性原因,使用 TBitmap 不是一个选项: Ge
我找到了遗留源代码和这里的摘录 - TMemoryStream *DFile = new TMemoryStream; TFileStream*BFile = new TFileStream; 以下是
我是一名优秀的程序员,十分优秀!