|
Imports System.Text
Imports System.Runtime.InteropServices
Module MyModule
' ********************************************************
' * WIN32_FIND_DATA 構造体と同等のクラス定義
' ********************************************************
< StructLayout( LayoutKind.Sequential, CharSet := CharSet.Ansi )> _
Public Class WIN32_FIND_DATA
Public fileAttributes As Integer = 0
Public creationTime_lowDateTime As Integer = 0
Public creationTime_highDateTime As Integer = 0
Public lastAccessTime_lowDateTime As Integer = 0
Public lastAccessTime_highDateTime As Integer = 0
Public lastWriteTime_lowDateTime As Integer = 0
Public lastWriteTime_highDateTime As Integer = 0
Public nFileSizeHigh As Integer = 0
Public nFileSizeLow As Integer = 0
Public dwReserved0 As Integer = 0
Public dwReserved1 As Integer = 0
< MarshalAs( UnmanagedType.ByValTStr, SizeConst := 256 )> _
Public fileName As String = Nothing
< MarshalAs( UnmanagedType.ByValTStr, SizeConst := 14 )> _
Public alternateFileName As String = Nothing
End Class
' ********************************************************
' * DLL 内 関数宣言
' ********************************************************
Declare Function LoadLibrary Lib "kernel32" Alias _
"LoadLibraryA" (ByVal lpDllName As String) As Integer
Declare Function FreeLibrary Lib "kernel32" Alias _
"FreeLibrary" (ByVal hModule As Integer) As Integer
Declare Function GetProcAddress Lib "kernel32" Alias _
"GetProcAddress"(ByVal hModule As Integer, lpProcName As String) As Integer
' ********************************************************
' * 外部関数の型宣言
' ********************************************************
Delegate Function GetSystemDirectory( _
ByVal lpBuffer As StringBuilder, ByVal nSize As Integer) As Integer
Delegate Function GetComputerName( _
ByVal lpBuffer As StringBuilder, ByRef nSize As Integer) As Integer
Delegate Function FindFirstFile( _
ByVal fileName As String, _
<[In], Out> ByVal findFileData As WIN32_FIND_DATA _
) As Integer
Delegate Function FindNextFile( _
ByVal hFindFile As Integer, _
<[In], Out> ByVal findFileData As WIN32_FIND_DATA _
) As Integer
' ********************************************************
' * 実行
' ********************************************************
Sub Main()
Dim strPath As new StringBuilder( 512 )
Dim hModule As Integer = LoadLibrary("kernel32.dll")
' ********************************************************
' システムディレクトリ表示
' ********************************************************
Dim ptr As IntPtr
ptr = GetProcAddress(hModule, "GetSystemDirectoryA")
if ptr <> IntPtr.Zero then
Dim func1 As GetSystemDirectory = _
Marshal.GetDelegateForFunctionPointer( _
ptr, _
GetType(GetSystemDirectory) _
)
Call func1( strPath, strPath.Capacity )
end if
Call System.Console.WriteLine( strPath )
' ********************************************************
' PC名表示
' ********************************************************
ptr = GetProcAddress(hModule, "GetComputerNameA")
if ptr <> IntPtr.Zero then
Dim func2 As GetComputerName = _
Marshal.GetDelegateForFunctionPointer( _
ptr, _
GetType(GetComputerName) _
)
Dim nSize As Integer = 512
Call func2( strPath, nSize )
end if
Call System.Console.WriteLine( strPath )
' ********************************************************
' ファイル一覧
' ********************************************************
Dim func3 As FindFirstFile
Dim func4 As FindNextFile
ptr = GetProcAddress(hModule, "FindFirstFileA")
if ptr <> IntPtr.Zero then
func3 = _
Marshal.GetDelegateForFunctionPointer( _
ptr, _
GetType(FindFirstFile) _
)
end if
ptr = GetProcAddress(hModule, "FindNextFileA")
if ptr <> IntPtr.Zero then
func4 = _
Marshal.GetDelegateForFunctionPointer( _
ptr, _
GetType(FindNextFile) _
)
end if
Dim wfd As New WIN32_FIND_DATA
Dim handle As Integer
Dim ret As Integer
handle = func3( "C:\tmp\*.*", wfd )
ret = -1
Do While( handle <> -1 and ret <> 0 )
Call System.Console.WriteLine( _
"{1,-10} {0}", wfd.fileName, wfd.nFileSizeLow )
ret = func4( handle, wfd )
Loop
Call FreeLibrary( hModule )
End Sub
End Module
| |