goo blog サービス終了のお知らせ 

半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■続)ADOのメモリリーク1

2010-02-09 23:00:01 | 雑記
■ADOのメモリリーク の続編。
前回、開いているBookに対してADO、DAO、QueryTable を用いてデータを読み込んだ時、全ての手法でメモリリークが発生する...ような結論になっていました。
今回追加検証をやってみたら、どうも改善されているようです。

結果を先にまとめると。
『Excel2003sp3以降、QueryTableを使った読み込みではメモリリーク問題は解消されているようである』
『OS:WindowsVistaでは、ADO、DAOに関してもメモリリーク問題は解消されているようである』

テストコード内容。

Option Explicit
'Performance monitor functions for Visual Basic from PDH.DLL
Private Declare Function PdhVbOpenQuery _
             Lib "pdh.dll" ( _
               ByRef QueryHandle As Long) As Long
Private Declare Function PdhCloseQuery _
             Lib "pdh.dll" ( _
               ByVal QueryHandle As Long) As Long
Private Declare Function PdhVbAddCounter _
             Lib "pdh.dll" ( _
               ByVal QueryHandle As Long, _
               ByVal CounterPath As String, _
               ByRef CounterHandle As Long) As Long
Private Declare Function PdhRemoveCounter _
             Lib "pdh.dll" ( _
               ByVal CounterHandle As Long) As Long
Private Declare Function PdhCollectQueryData _
             Lib "pdh.dll" ( _
               ByVal QueryHandle As Long) As Long
Private Declare Function PdhVbGetDoubleCounterValue _
             Lib "pdh.dll" ( _
               ByVal CounterHandle As Long, _
               ByRef CounterStatus As Long) As Double
'-------------------------------------------------
Sub test()
  Dim x As String

  x = InputBox("ado or dao or qry")
  If Len(x) = 0 Then Exit Sub
  Call memLeaktest(x)
End Sub
'-------------------------------------------------
Sub memLeaktest(prc As String)
  Const tx As Long = 20  'テスト回数
  Const wkSQL = "SELECT * FROM [data$]"
  Const cPath = "¥Process(Excel)¥Private Bytes"
  Dim ws   As Worksheet
  Dim rng   As Range
  Dim wkBook As String
  Dim hPDHQry As Long  'Handle to performance monitor query
  Dim hPDHCnt As Long  'Handle to performance monitor counter
  Dim cStat  As Long  'Status of counter when checked
  Dim pByts  As Double 'Value of counter when checked
  Dim x    As Long
  Dim i    As Long
  Dim ret(0 To tx + 1)

  With ThisWorkbook
    Set ws = .Sheets("out")
    Set rng = .Sheets("data").Range("A2")
    wkBook = .FullName
  End With
  x = PdhVbOpenQuery(hPDHQry)
  x = PdhVbAddCounter(hPDHQry, cPath, hPDHCnt)
  ret(0) = prc
  x = PdhCollectQueryData(hPDHQry)
  pByts = PdhVbGetDoubleCounterValue(hPDHCnt, cStat)
  If cStat = 0 Then
    ret(1) = CLng(pByts) ¥ 1024
  End If

  For i = 1 To tx
    rng.Value = "'" & i
    '■TESTプロシージャ
    Select Case prc
    Case "ado"
      Call ADOtest(ws, wkBook, wkSQL)
    Case "dao"
      Call DAOtest(ws, wkBook, wkSQL)
    Case "qry"
      Call QRYtest(ws, wkBook, wkSQL)
    End Select
    x = PdhCollectQueryData(hPDHQry)
    pByts = PdhVbGetDoubleCounterValue(hPDHCnt, cStat)
    If cStat = 0 Then
      ret(i + 1) = CLng(pByts) ¥ 1024
    End If
    Debug.Print ws.Cells(1).Value
  Next

  x = PdhRemoveCounter(hPDHCnt)
  x = PdhCloseQuery(hPDHQry)
  ThisWorkbook.Sheets("chk").Range("IV1").End(xlToLeft) _
        .Offset(, 1).Resize(tx + 2).Value _
        = Application.Transpose(ret)

  Set rng = Nothing
  Set ws = Nothing
End Sub

# 2 へ続く

Comment    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■続)ADOのメモリリーク2 | TOP | ■OFFSETとROW|COLUMN関数を絡... »
最新の画像もっと見る

post a comment

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。
ブログ作成者から承認されるまでコメントは反映されません。

Recent Entries | 雑記