EXE程序和DLL之間可能傳遞FILE指針,但是可能會造成程序崩潰。這是由於_lock_file引起的
- 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) );
- }
if ( (pf >= _iob) && (pf <= (&_iob[_IOB_ENTRIES-1])) ) 把fp和一個全局變量_iob比較,exe和DLL可能會有不同的全局變量,這導致fp不在_iob數組的範圍內,導致出現錯誤。
解決的頒發是exe和DLL都動態連接到CRT,或者把DLL編譯成靜態庫。