0

我将继续构建两个简单的进程,通过简单的(匿名)管道将类对象相互投掷(参见我的上一篇文章)。现在我为自己揭示了 boost::serialization (感谢回答的人),并试图通过 ::WriteFile::ReadFile 对某些类进行序列化。所以 - 我做错了什么?


1)我创建了一些类

 #pragma once
 #include "wtypes.h"
 #include <boost\archive\binary_oarchive.hpp>
 #include <boost\archive\binary_iarchive.hpp>
 #include <boost\serialization\binary_object.hpp>

 class CTextContainer
 {
 friend class boost::serialization::access;
     template<class Archive>
     void serialize(Archive & ar, const unsigned int version)
     {
         ar & m_sText;
         ar & m_dwCRC;
         ar & m_dwSize;
     }

 public:
      CTextContainer() : m_dwCRC(0), m_dwSize(0)
      {
          ZeroMemory(m_sText, sizeof(m_sText));
          m_dwSize = sizeof(*this);
      }
      CTextContainer(LPCTSTR sText) : m_dwCRC(0), m_dwSize(0)
      {
         ZeroMemory(m_sText, sizeof(m_sText));
         wcsncpy_s(m_sText, 1024, sText, wcslen(sText));
         m_dwSize = sizeof(*this);
      }
      virtual ~CTextContainer(){}
      LPTSTR GetText() const{return (LPTSTR) m_sText;}
      protected:
      DWORD m_dwCRC;
      DWORD m_dwSize;
      TCHAR m_sText[1024];
 }; //end of class

2)现在我正试图从这个类中读取二进制存档并将其内容写入管道的一端......

boost::archive::binary_oarchive oa(ofs);
oa << tc;
::WriteFile(hPipe, &oa, dwRead, &dwWritten, NULL) == FALSE 

它不会那样工作,对吧?那么,会如何呢?

3) 另一边的操作相同?

4

2 回答 2

1

我认为这里的问题是您正在尝试将指针传递给 WriteFile 函数中的存档对象。你应该做的是提供一个指向序列化数据的指针。

std::stringstream ss;
boost::archive::binary_oarchive oa(ss);
oa << tc;
::WriteFile(hPipe, ss.str().data(), ss.str().data().size(), &dwWritten, NULL)

作为更好的选择,您应该为 binary_oarchive 构造函数提供一个直接写入文件句柄的 ostream 实现。

于 2009-02-25T15:03:07.193 回答
0

假设您为 dwRead 传递了正确的值,我认为问题在于流尚未被刷新。确保在块内创建 binary_oarchive,这样当它超出范围时,它的析构函数会刷新流。

std::ofstream ofs("filename");
{
    boost:archive::binary_oarchive oa(ofs);
    oa << tc;
}

// Set up your pipe and assign a value to dwRead
// ...

::WriteFile(hPipe, &oa, dwRead, &dwWritten, NULL);
于 2009-01-09T15:11:25.193 回答