0

単純な (匿名の) パイプを介してクラス オブジェクトを相互にスローする 2 つの単純なプロセスを構築し続けています (以前の投稿を参照)。今、私は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 に答える