すみません、dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4226 のコードでは
FileRead_findClose を呼ぶ箇所を間違っていましたので修正しました
修正前は
// 検索開始、最初のファイルの情報を取得
// ( *.* や ???.* などのシンプルなワイルドカード表現に対応しています )
FindHandle = FileRead_findFirst( "D:\\File\\*", &FileInfo ) ;
// ファイルが見つかった場合のみ分岐の中を実行
if( FindHandle != ( DWORD_PTR )-1 )
{
y = 0 ;
do
{
// ファイル名とフォルダかファイルかの情報を描画
DrawFormatString( 0, y, GetColor( 255,255,255 ), "%s %s", FileInfo.Name, FileInfo.DirFlag ? "フォルダ" : "ファイル" ) ;
// 描画y座標をずらす
y += 16 ;
// 検索に引っかかる次のファイルの情報を取得、無かったらループを抜ける
}while( FileRead_findNext( FindHandle, &FileInfo ) >= 0 ) ;
}
// 検索ハンドルの後始末
FileRead_findClose( FindHandle ) ;
となっていましたが、正しくは
// 検索開始、最初のファイルの情報を取得
// ( *.* や ???.* などのシンプルなワイルドカード表現に対応しています )
FindHandle = FileRead_findFirst( "D:\\File\\*", &FileInfo ) ;
// ファイルが見つかった場合のみ分岐の中を実行
if( FindHandle != ( DWORD_PTR )-1 )
{
y = 0 ;
do
{
// ファイル名とフォルダかファイルかの情報を描画
DrawFormatString( 0, y, GetColor( 255,255,255 ), "%s %s", FileInfo.Name, FileInfo.DirFlag ? "フォルダ" : "ファイル" ) ;
// 描画y座標をずらす
y += 16 ;
// 検索に引っかかる次のファイルの情報を取得、無かったらループを抜ける
}while( FileRead_findNext( FindHandle, &FileInfo ) >= 0 ) ;
// 検索ハンドルの後始末
FileRead_findClose( FindHandle ) ;
}
となります
上記コードの検索対象である D:\File のフォルダが無い場合、FileRead_findFirst は失敗して FindHandle には
( DWORD_PTR )-1 が代入される( FileRead_findFirst の戻り値が ( DWORD_PTR )-1 になる )のですが、
修正前のコードでは FileRead_findFirst が失敗した場合も FileRead_findClose を呼んでしまっていました
FileRead_findClose は無効なハンドルが渡されるとアクセス違反が発生してしまうので
FileRead_findFirst が失敗して返された ( DWORD_PTR )-1 ( ←ハンドルとしては無効な値 )を
FindRead_findClose に渡して呼びだしたことによりアクセス違反が発生した、という形です