アンインストール手順中に使用して、事前にユーザーに警告したいと思います。この手順は W2000+ で機能するはずなので、Vista API は使用できません。
これはいくつかの競合をキャッチするようです:
if( GetFileAttributes( lpPath ) == INVALID_FILE_ATTRIBUTES )
{
// File does not exist
}
else
{
BOOL bCanDelete = FALSE ;
HANDLE hFile = CreateFile( path,
GENERIC_WRITE /*|DELETE*/,
0 /*FILE_SHARE_DELETE*/,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if( hFile != INVALID_HANDLE_VALUE )
{
DWORD size = 10000 ; // a number > file size allowed
if( size != INVALID_FILE_SIZE )
{
if( LockFile( hFile, 0,0, size,0) )
{
UnlockFile( hFile, 0,0, size,0) ;
bCanDelete = TRUE ;
}
}
CloseHandle( hFile ) ;
}
}
つまり、次の状況を検出します: a) 実行中の exe ファイルの削除 b) 開いている pdf の削除
GENERIC_WRITE|DELETE を使用すると、同様に動作するようです。DELETE を単独で使用すると、b) の場合は機能しますが、a) の場合は機能しません。
LockFile() が意味のある競合を検出するという明確な証拠はありませんが、検出されたとします。
誰かがより良いアイデアを持っていますか?