Поведение _SH_SECURE
зависит от доступа, запрошенного в аргументе mode
к _fsopen()
/ _wfsopen()
. Если запрашивается только доступ для чтения, то _SH_SECURE
отображается на FILE_SHARE_READ
. В противном случае он отображается на 0
(эксклюзивный доступ).
Контраст _SH_DENYWR
, который всегда отображается на FILE_SHARE_READ
.
Соответствующая часть исходного кода CRT (строки 269-301 open.c
в Visual Studio 2010) выглядит следующим образом:
/*
* decode sharing flags
*/
switch ( shflag ) {
case _SH_DENYRW: /* exclusive access */
fileshare = 0L;
break;
case _SH_DENYWR: /* share read access */
fileshare = FILE_SHARE_READ;
break;
case _SH_DENYRD: /* share write access */
fileshare = FILE_SHARE_WRITE;
break;
case _SH_DENYNO: /* share read and write access */
fileshare = FILE_SHARE_READ | FILE_SHARE_WRITE;
break;
case _SH_SECURE: /* share read access only if read-only */
if (fileaccess == GENERIC_READ)
fileshare = FILE_SHARE_READ;
else
fileshare = 0L;
break;
default: /* error, bad shflag */
_doserrno = 0L; /* not an OS error */
*pfh = -1;
_VALIDATE_RETURN_ERRCODE(( "Invalid sharing flag" , 0 ), EINVAL);
}