[VB.NET]MFC CArchive的讀取

[VB.NET]MFC CArchive的讀取

CArchive是MFC的序列化處理類別,除了一般的序列化存檔會用到外,在SendMessage傳送WN_COPYDATA訊息,連帶觸發OnCopyData,其傳遞的資料也是CArchive的格式。

 

CArchive的檔案格式若要在.NET程式中讀取,我們可以直接使用.NET Framework中的BinaryReader。

 

也可以參考MFC CArchive的寫法自行實作讀取,有興趣的可直接透過VC6 Debug追進CArchive看程式的處理,或是直接看網路上的文章

 

下面這個類別就是之前自己寫來讀取CArchive的。


Imports System.Text
Public Class CArchive


#Region "Config"
    Private ReadOnly BYTES_COUNT_IN_BOOL As Byte = 4  'VC6的BOOL佔 4 Bytes
    Private ReadOnly BYTES_COUNT_IN_INT As Byte = 4  'VC6的Int佔 4 Bytes
    Private ReadOnly BYTES_COUNT_IN_FLOAT As Byte = 4  'VC6的Float佔 4 Bytes
    Private ReadOnly BYTES_COUNT_IN_DOUBLE As Byte = 8  'VC6的Double佔 8 Bytes
    Private ReadOnly BUFFERSIZE As Integer = 512

#End Region



#Region "Private Var"

    Private m_baryBinaryData(BUFFERSIZE) As Byte
    Private m_fsFileStream As FileStream

    Private m_nDataLength As Integer
    Private m_strData As String
    Private m_nData As Integer
    Private m_sData As Single
    Private m_dData As Double
    Private m_bData As Boolean
#End Region




#Region "Constructer"


    Public Sub New(ByVal FilePath As String)
        m_fsFileStream = New FileStream(FilePath, FileMode.Open)
    End Sub


#End Region




#Region "Public Method"

    Public Function GetString() As String
        m_nDataLength = m_fsFileStream.ReadByte
      
        m_fsFileStream.Read(m_baryBinaryData, 0, m_nDataLength)


        m_strData = Encoding.Default.GetString(m_baryBinaryData, 0, m_nDataLength)

        Return m_strData

    End Function

    Public Function GetInt() As Integer

        m_fsFileStream.Read(m_baryBinaryData, 0, BYTES_COUNT_IN_INT)


        m_nData = BitConverter.ToInt32(m_baryBinaryData, 0)

        Return m_nData

    End Function


    Public Function GetDouble() As Double

        m_fsFileStream.Read(m_baryBinaryData, 0, BYTES_COUNT_IN_DOUBLE)


        m_dData = BitConverter.ToDouble(m_baryBinaryData, 0)

        Return m_dData

    End Function

    Public Function GetFloat() As Single

        m_fsFileStream.Read(m_baryBinaryData, 0, BYTES_COUNT_IN_FLOAT)


        m_sData = BitConverter.ToSingle(m_baryBinaryData, 0)

        Return m_sData

    End Function

    Public Function GetBoolean() As Boolean

        m_fsFileStream.Read(m_baryBinaryData, 0, BYTES_COUNT_IN_BOOL)

        m_bData = BitConverter.ToBoolean(m_baryBinaryData, 0)

        Return m_bData

    End Function

#End Region

End Class