c ++ - Hvad er forskellen mellem \_SH\_SECURE og \_SH\_DENYWR

Indlæg af Hanne Mølgaard Plasc

Problem



\_SH\_DENYWR nægter ethvert andet forsøg på at åbne en fil med skrive tilladelser (del overtrædelse)
\_SH\_SECURE Indstiller sikker tilstand (delt læsning, eksklusiv skriveadgang)


\_SH\_SECURE synes at være nyere, baseret på det faktum, at dokumenterne synes at glansere over det eller udelade det, alt efter hvor du ser ud. Der er næsten ingen info om 'nettet, som jeg kunne finde på det.


Hvordan er de anderledes?

Bedste reference


Opførelsen af ​​\_SH\_SECURE afhænger af den adgang, der er anmodet om i mode argumentet til \_fsopen()/\_wfsopen(). Hvis kun er anmodet om læsadgang, bliver \_SH\_SECURE kort til FILE\_SHARE\_READ. Ellers kortes det til 0 (eksklusiv adgang).


Kontrast \_SH\_DENYWR, som altid kort til FILE\_SHARE\_READ.


Den relevante del af CRT-kildekoden (linjer 269-301 af open.c i Visual Studio 2010 er som følger:


/*
 * 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);
}