cStorage.cls
上传用户:davilee3
上传日期:2015-04-22
资源大小:986k
文件大小:6k
源码类别:

浏览器

开发平台:

Visual Basic

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cStorage"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. 'cStorage 使用"结构化存储"
  15. '2004-9-15  正在看一本讲com的书,今天恰好看到"结构化存储"这部分,
  16. '           发现是好东西啊,不过使用起来好像并不太方便,于是写下这个类
  17. '8/5/2005   :strconv 增加使用了 LocaleID参数
  18. Option Explicit
  19. 'Private mFn As Long
  20. Private mOpened As Boolean
  21. Private mStorage() As olelib.IStorage
  22. Private mStgCnt As Long
  23. Private mStream As olelib.IStream
  24. Public Function OpenFile(nfile As String, path As String) As Boolean
  25. 'On Error Resume Next
  26. Dim tStg As olelib.IStorage
  27. 'Dim tstm As olelib.IStream
  28. Dim tstr() As String, tUb As Long
  29. Dim i&
  30. Dim rtn As Boolean
  31. Call CloseFile
  32. rtn = True
  33. Set tStg = OpenRootStorage(nfile)
  34. If Not tStg Is Nothing Then
  35.     tstr = Split(path, "")
  36.     tUb = UBound(tstr)
  37.     ReDim mStorage(0 To tUb)
  38.     mStgCnt = tUb + 1
  39.     Set mStorage(0) = tStg
  40.     For i = 0 To tUb
  41.         If i < tUb Then
  42.             Set mStorage(i + 1) = OpenStorage(mStorage(i), tstr(i))
  43.             If mStorage(i + 1) Is Nothing Then
  44.                 rtn = False
  45.                 Exit For
  46.             End If
  47.         Else
  48.             Set mStream = OpenStream(mStorage(i), tstr(i))
  49.             If mStream Is Nothing Then
  50.                 rtn = False
  51.                 Exit For
  52.             End If
  53.         End If
  54.     Next i
  55. Else
  56.     rtn = False
  57. End If
  58. If rtn Then
  59.     mOpened = True
  60. Else
  61.     mStgCnt = 0
  62.     ReDim mStorage(0 To mStgCnt)
  63.     Set mStream = Nothing
  64. End If
  65. OpenFile = rtn
  66. End Function
  67. Private Function OpenRootStorage(nfile As String) As olelib.IStorage
  68. On Error Resume Next
  69. Dim tRoot As olelib.IStorage
  70. Set tRoot = StgCreateDocfile(nfile, STGM_READWRITE Or STGM_SHARE_EXCLUSIVE)
  71. If tRoot Is Nothing Then
  72.     Set tRoot = StgOpenStorage(nfile, Nothing, STGM_READWRITE Or STGM_SHARE_EXCLUSIVE, vbNullString)
  73. End If
  74. Set OpenRootStorage = tRoot
  75. End Function
  76. Private Function OpenStorage(nStg As olelib.IStorage, pwcsName As String) As olelib.IStorage
  77. On Error Resume Next
  78. Dim tStg As olelib.IStorage
  79. Set tStg = nStg.CreateStorage(pwcsName, STGM_READWRITE Or STGM_SHARE_EXCLUSIVE)
  80. If tStg Is Nothing Then
  81.     Set tStg = nStg.OpenStorage(pwcsName, 0, STGM_READWRITE Or STGM_SHARE_EXCLUSIVE)
  82. End If
  83. Set OpenStorage = tStg
  84. End Function
  85. Private Function OpenStream(nStg As olelib.IStorage, pwcsName As String) As olelib.IStream
  86. On Error Resume Next
  87. Dim tstm As olelib.IStream
  88. Set tstm = nStg.CreateStream(pwcsName, STGM_READWRITE Or STGM_SHARE_EXCLUSIVE)
  89. If tstm Is Nothing Then
  90.     Set tstm = nStg.OpenStream(pwcsName, 0, STGM_READWRITE Or STGM_SHARE_EXCLUSIVE)
  91. End If
  92. Set OpenStream = tstm
  93. End Function
  94. Public Function CloseFile() As Boolean
  95. mStgCnt = 0
  96. ReDim mStorage(0 To mStgCnt)
  97. Set mStream = Nothing
  98. mOpened = False
  99. End Function
  100. Public Function GetStream() As olelib.IStream
  101. Set GetStream = mStream
  102. End Function
  103. 'Public Function WriteStringLng(ByVal nStr As String) As Boolean
  104. 'Dim tLen&
  105. 'If mOpened Then
  106. '    nStr = StrConv(nStr, vbFromUnicode)
  107. '    tLen = LenB(nStr)
  108. '    mStream.Write ByVal VarPtr(tLen), 4
  109. '    mStream.Write ByVal StrPtr(nStr), tLen
  110. 'End If
  111. 'End Function
  112. '
  113. 'Public Function ReadStringLng(nStr As String) As Boolean
  114. 'Dim tLen&
  115. 'Dim tArr() As Byte
  116. 'If mOpened Then
  117. '    mStream.Read ByVal VarPtr(tLen), 4
  118. '    ReDim tArr(0 To tLen - 1)
  119. '    mStream.Read ByVal VarPtr(tArr(0)), tLen
  120. '    nStr = StrConv(tArr, vbUnicode)
  121. 'End If
  122. 'End Function
  123. Public Function WriteString(ByVal nStr As String, Optional lenbytes As Long = 4) As Boolean
  124. Dim tLen&
  125. If lenbytes > 4 Or lenbytes < 0 Then lenbytes = 1
  126. If mOpened Then
  127.     nStr = StrConv(nStr, vbFromUnicode, LocaleID_CurUse)
  128.     tLen = LenB(nStr)
  129.     mStream.Write ByVal VarPtr(tLen), lenbytes
  130.     mStream.Write ByVal StrPtr(nStr), tLen
  131. End If
  132. End Function
  133. Public Function GetString(Optional lenbytes As Long = 4) As String
  134. Dim tLen&
  135. Dim tArr() As Byte
  136. If lenbytes > 4 Or lenbytes < 0 Then lenbytes = 1
  137. If mOpened Then
  138.     mStream.Read ByVal VarPtr(tLen), lenbytes
  139.     If tLen > 0 Then
  140.         ReDim tArr(0 To tLen - 1)
  141.         mStream.Read ByVal VarPtr(tArr(0)), tLen
  142.         GetString = StrConv(tArr, vbUnicode, LocaleID_CurUse)
  143.     End If
  144. Else
  145.     GetString = ""
  146. End If
  147. End Function
  148. '获得整数
  149. Public Function GetInteger(Optional lenbytes As Long = 4) As Long
  150. Dim tVal&
  151. If lenbytes > 4 Or lenbytes < 0 Then lenbytes = 1
  152. If mOpened Then
  153.     mStream.Read ByVal VarPtr(tVal), lenbytes
  154.     GetInteger = tVal
  155. End If
  156. End Function
  157. '写入整数
  158. Public Function PutInteger(ByVal nVal&, Optional lenbytes As Long = 4) As Boolean
  159. If lenbytes > 4 Or lenbytes < 0 Then lenbytes = 1
  160. If mOpened Then
  161.     mStream.Write ByVal VarPtr(nVal), lenbytes
  162. End If
  163. End Function
  164. Public Function GetPos() As Long
  165. If mOpened And Not mStream Is Nothing Then
  166.     GetPos = mStream.Seek(0, STREAM_SEEK_CUR)
  167. End If
  168. End Function
  169. Public Sub SeekTo(nMoveTo As Long)
  170. If mOpened And Not mStream Is Nothing Then
  171.     mStream.Seek ByVal nMoveTo, STREAM_SEEK_SET
  172. End If
  173. End Sub
  174. Public Function StmRead(nPt&, nSize&) As Long
  175. If mOpened And Not mStream Is Nothing Then
  176.     StmRead = mStream.Read(ByVal nPt, nSize)
  177. End If
  178. End Function
  179. Public Function StmWrite(nPt&, nSize&) As Long
  180. If mOpened And Not mStream Is Nothing Then
  181.     StmWrite = mStream.Write(ByVal nPt, nSize)
  182. End If
  183. End Function
  184. Private Sub Class_Initialize()
  185. mOpened = False
  186. End Sub
  187. Private Sub Class_Terminate()
  188. Call CloseFile
  189. End Sub