エラー API関数DLLの実行時エラーを回避する

※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。

※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。

Option Explicit

'GetActiveWindow 関数(Windows API)
Declare Function GetActiveWindow Lib "user32" () As Long
'GetWindowRect 関数(Windows API)
Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, _
               lpRect As RECT) As Long

'ウィンドウを構成している四角形の各辺の長さを
'RECT データ構造体に設定します。
'無効なハンドルを渡すとエラーが発生します。

Type RECT
      Left As Long
      Top  As Long
      Right  As Long
      Bottom As Long
End Type

Const ERROR_INVALID_WINDOW_HANDLE   As Long = 1400
Const ERROR_INVALID_WINDOW_HANDLE_DESCR As String _
= "無効なウィンドウ ハンドルです。"


Sub PrintWindowCoordinates(hwnd As Long)
' ウィンドウの左、右、上、下の位置を
' ピクセル単位で出力します。
Dim rectWindow As RECT
' ウィンドウ ハンドルと空のデータ構造体を渡します。
' 関数が 0 を返す場合は、エラーが発生しています。
    If GetWindowRect(hwnd, rectWindow) = 0 Then
        ' 無効なハンドルを渡したことにより、エラーが発生した場合は
        ' LastDLLError を調べ、ダイアログ ボックスを表示します。
        Debug.Print "1." & Err.LastDllError
            If Err.LastDllError = ERROR_INVALID_WINDOW_HANDLE Then
                MsgBox ERROR_INVALID_WINDOW_HANDLE_DESCR, _
                   Title:="エラー !"
                Debug.Print "2." & ERROR_INVALID_WINDOW_HANDLE_DESCR
            End If
    Else
        Debug.Print "Top:" & rectWindow.Top
        Debug.Print "Right:" & rectWindow.Right
        Debug.Print "Bottom:" & rectWindow.Bottom
        Debug.Print "Left:" & rectWindow.Left
    End If
End Sub


Private Sub APIGetError()
Dim GAW As Long
'正常処理
'アクティブ ウィンドウの座標を取得する
'GetActiveWindow 関数(Windows API)
GAW = GetActiveWindow
Debug.Print "アクティブウィンドウ座標:" & GAW
Call PrintWindowCoordinates(GAW)
'アクティブウィンドウ座標:13175122
'Top:-4
'Right:1028
'Bottom:742
'Left:-4
Call PrintWindowCoordinates(GAW + 1)
'1.1400
'2.無効なウィンドウ ハンドルです。
End Sub

  • LastDLLError プロパティ

  • 最後にダイナミック リンク ライブラリ (DLL) を呼び出したときのエラー コードを返します。
  • 値の取得のみ可能です。
  • Macintosh では、LastDLLError は常に 0 の値を返します。
  • 解説

  • LastDLLError プロパティは、Visual Basic のコードから DLL 呼び出しを行った場合のみ参照できます。
  • 通常、DLL 呼び出しが行われると、呼び出された関数は、関数の実行が正常に終了したかどうかを戻り値として返し、LastDLLError プロパティも設定されます。
  • どのような値を返すかは、それぞれの DLL についてのドキュメントを参照してください。
  • 失敗を示す値が返された場合、LastDLLError プロパティを確認する必要があります。
  • LastDLLError プロパティが設定された場合、例外は発生しません。

エラー情報の取得

  • DLL 関数で発生する実行時エラーは、VBA 内で発生する実行時エラーとは異なり、エラー メッセージ ボックスが表示されません。
  • 実行時エラーが発生したとき、DLL 関数はエラーが発生したことを示す何らかの値を返しますが、エラーの発生により VBA の実行が中断されることはありません。
  • Windows API の一部の関数は、実行時エラーのエラー情報を格納します。C/C++ でプログラミングしている場合は、GetLastError 関数を使用して、最後に発生したエラーに関する情報を取得できます。
  • ただし、VBA から GetLastError を呼び出した場合、正確な結果が返されないことがあります。
  • VBA から DLL エラーに関する情報を取得する場合、VBA Err オブジェクトの LastDLLError プロパティを使用できます。
  • LastDLLError プロパティは発生したエラーの番号を返します。
  • LastDLLError プロパティを使用するには、どのエラー番号がどのエラーに対応しているかを知っておく必要があります。
  • この情報を Win32API.txt ファイルから得ることはできませんが、Microsoft Platform SDK から無償で入手できます。
  • Platform SDK
  • http://msdn2.microsoft.com/en-us/library/aa383750.aspx

 

 

2000年01月01日|[VBサンプルコード]:[Error]