PDA

Visualizza la versione completa : [C++] Errore nella funzione fread_s() con libpng


giuseppe500
02-01-2013, 12:40
ciao.
Ho compilato un progetto opensource(pnglib) ma credo che non si il fulcro del problema.
Il problema nasce quando pnglib invoca la funzione fread_s che mi da un errore su



/* define locking/unlocking version */
size_t __cdecl fread_s(
void *buffer,
size_t bufferSize,
size_t elementSize,
size_t count,
FILE *stream
)
{
size_t retval = 0;

if (elementSize == 0 || count == 0)
{
return 0;
}


// only checking for stream == NULL here for _lock_str()
// the rest of the validation is in _fread_nolock_s()
if (stream == NULL )
{
if (bufferSize != SIZE_MAX)
{
memset(buffer, _BUFFER_FILL_PATTERN, bufferSize);
}

_VALIDATE_RETURN((stream != NULL), EINVAL, 0);
}

_lock_str(stream);//ERRORE
__try
{
/* do the read; _fread_nolock_s will make sure we do not buffer overrun */
retval = _fread_nolock_s(buffer, bufferSize, elementSize, count, stream);
}
__finally
{
_unlock_str(stream);
}

return retval;
}


l'errore è sul _lock_str(stream); e in particolare su questa funzione:


void __cdecl _lock_file (
FILE *pf
)
{
/*
* The way the FILE (pointed to by pf) is locked depends on whether
* it is part of _iob[] or not
*/
if ( (pf >= _iob) && (pf <= (&_iob[_IOB_ENTRIES-1])) )
{
/*
* FILE lies in _iob[] so the lock lies in _locktable[].
*/
_lock( _STREAM_LOCKS + (int)(pf - _iob) );
/* We set _IOLOCKED to indicate we locked the stream */
pf->_flag |= _IOLOCKED;
}
else
/*
* Not part of _iob[]. Therefore, *pf is a _FILEX and the
* lock field of the struct is an initialized critical
* section.
*/
EnterCriticalSection( &(((_FILEX *)pf)->lock) );/////ERRORE
}


qui EnterCriticalSection( &(((_FILEX *)pf)->lock) );/////ERRORE

quello che non riesco a capire è che oltre al file .png il progetto legge altri file con la stessa dinamica , solo che queste letture vanno tutte a buon fine , funziona anche il lock, solo il file .png ha questo problema, ho provato a guradare i permessi ma sembra tutto ok.
grazie.

c0der
02-01-2013, 13:45
Ho tre perplessità:
1) il codice che hai riportato non è certo della libreria pnglib di cui parli, ma delle librerie di sistema che usi. Librerie che credo siano C, non C++ giusto? Potresti riportare anche da che file hai estratto quelle parti di codice?
2) hai scritto pnglib... sei sicuro? non è che invece è libpng, ben più nota? Potresti riportare il link della libreria png di cui parli?
3) sarebbe meglio che riportassi l'errore tale e quale ti appare in esecuzione e possibilmente con lo stacktrace.
Ciao.

giuseppe500
02-01-2013, 14:01
Originariamente inviato da c0der
Ho tre perplessità:
1) il codice che hai riportato non è certo della libreria pnglib di cui parli, ma delle librerie di sistema che usi. Librerie che credo siano C, non C++ giusto? Potresti riportare anche da che file hai estratto quelle parti di codice?
2) hai scritto pnglib... sei sicuro? non è che invece è libpng, ben più nota? Potresti riportare il link della libreria png di cui parli?
3) sarebbe meglio che riportassi l'errore tale e quale ti appare in esecuzione e possibilmente con lo stacktrace.
Ciao.
1)si le librerie sono in c
2)si, hai ragione è libpng
3)l'errore era che le proprietà di configurazione della dll di libpng dovevano essere le stesse del mio progetto, inoltre non avevo incluso una libreria , la zlib.
Ho risolto con una lib statica e aggiungendo la zlib.lib dopo averla compilata.
grazie, comunque c0der.
ciao.

Loading