将从嵌入式资源文件创建的 ifstream 传递给 boost XML 解析器

Passing ifstream created from embedded resource file to boost XML parser

我正在尝试解析嵌入式资源 XML 文件:

HRSRC hresinfo = FindResource(hInstance, MAKEINTRESOURCE(IDR_XML1), _T("XML"));
if (hresinfo)
{
    HGLOBAL hRes = LoadResource(hInstance, hresinfo);
    DWORD datasize = SizeofResource(hInstance, hresinfo); // this size is correct
    LPVOID data = LockResource(hRes);

    if (hRes && datasize != 0 && data) {
        ifstream in;
        in.rdbuf()->pubsetbuf((char*)data, datasize);

        streamsize size = in.rdbuf()->in_avail();
        printf("size=%d", size); // this size is 0
        
        pt::read_xml(in, tree); // parses nothing
    }
    else {
        printf("error: %d\n", GetLastError());
    }
}

memcpy 将数据放入常规缓冲区并打印每个字符,这让我相信问题出在 ifstream 上。

我认为 pubsetbuf 没有满足您的需求(但是,我并不完全理解它到底做了什么)。要设置从真实文件加载的 std::ifstream 内容,您可以执行以下操作:

    std::ifstream in;
    std::stringstream ss{std::string((char*)data, datasize)};
    in.basic_ios<char>::rdbuf(ss.rdbuf());
    std::string str;
    in >> str;  // to check if ifstream has expected content
    std::cout << "str = " << str << std::endl;

您的 ifstream 将共享与 stringstreamdata 指向的原始内存块创建的内容相同的内容。

编辑

抱歉,忘了 std::ifstream。我看到pt::read_xml接受std::basic_istream,直接传std::stringstream就可以了