【问题标题】:Write array to IStream将数组写入 IStream
【发布时间】:2012-04-24 21:08:28
【问题描述】:

我收到一些数据作为 char 数组。我想将此数据传递给接收流的方法(IUnknown *pInput)。

我尝试调试这段代码(使用visual c++):


#include "xmllite.h"
#include <atlbase.h>

CHAR acTemp [100] = {0};
CComPtr<IStream> pDataStream;
HRESULT hr;

hr = IStream_Write (pDataStream, acTemp, sizeof (acTemp));

我得到错误:

SSL.exe 中 0x75e49875 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。

我知道以下从文件创建字符串的代码会起作用,但我不想仅仅因为无法从原始数组转换而创建文件。

CComPtr<IStream> pFileStream;
LPCSTR szFileName = "FileName";
HRESULT hr;

hr = SHCreateStreamOnFile(szFileName, STGM_READ, &pFileStream);

【问题讨论】:

    标签: c++ windows xmllite


    【解决方案1】:

    你可以的

    CComPtr<IStream> stream;
    COM_VERIFY(::CreateStreamOnHGlobal(0, TRUE, &stream));
    

    也可以使用 GlobalAlloc 来指定要使用的“自己的”内存。 (如果您的德语很好 - 请参阅http://msdn.microsoft.com/de-de/magazine/cc163436.aspx#S5)。

    【讨论】:

    • 对不起,请问如何指定这个内存的内容呢?如何与“acTemp”链接? (这个数组会有一些数据输入)
    • 正如文章所说(德语:-))要使用的内存由 CreateStreamOnHGlobal 的第一个参数指定。该示例给出了 0,但可以使用 GlobalAlloc。也许它无法连接到 acTemp... 抱歉 :-(
    • 我相信德语页面和this是一样的
    【解决方案2】:

    具体回答问题,sn-p是:

    CHAR *acTemp;
    acTemp = (CHAR *) GlobalAlloc (GMEM_FIXED, dwBytes);
    memcpy (acTemp, acXml, dwBytes);
    hr = ::CreateStreamOnHGlobal(acTemp, TRUE, &pDataStream);
    

    在这种情况下,acXml 是包含要放入流中的数据的 char 数组。

    我不知道为什么前一个不起作用,但这个到目前为止运行良好。感谢@Matthias 的帮助!

    【讨论】:

    • 也可以先创建流,然后用它的write方法填充数据,这样更直接。
    • @SamuelZhang,你会怎么做?我遇到了一些麻烦,我试过这个:IStream *pInput;CHAR caStream [] = "asdkhgkjfhgdhg";pInput-&gt;Write (caStream, sizeof (caStream), NULL); 并在 SSL.exe 中的 0x002b1be2 处收到错误未处理的异常:0xC0000005:访问冲突读取位置 0x00000000。
    • 首先,你需要创建一个IStream的实例,例如带有 NULL 处理程序的 CreateStreamOnHGlobal。接下来,sizeof 只返回 char 指针的大小。请改用 ARRAYSIZE。
    猜你喜欢
    • 2012-11-22
    • 2020-09-26
    • 2016-02-09
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2019-12-07
    • 2017-09-16
    • 1970-01-01
    相关资源
    最近更新 更多