Я сомневаюсь, что это будет влиять на многих людей, так как это довольно неясными, но если вы получите ваш FILE *, как это:
HANDLE hMyFile = CreateFile(...);
FILE* pFile = _fdopen(_open_osfhandle((long)hMyFile, <flags>), "rb");
CloseHandle(hMyFile);
Тогда вы будете течь поток для каждого файла, открыт. После выполнения _open_osfhandle и _fdopen, вы должны вызвать fclose() в pFile, чтобы закрыть ваш дескриптор. CloseHandle, по-видимому, недостаточно умен, чтобы освободить рывок, который fdopen ассоциирует с вашей ручкой, но fclose достаточно умен, чтобы закрыть вашу ручку вместе с FILE * -соединенным слоем.
Приложение, над которым я работал, выполнило это, потому что определенный API прошел вокруг HANDLE, а конкретному разработчику API был необходим FILE *, поэтому разработчик сделал файл _fdopen/_open_osfhandle, чтобы получить файл *. Однако это означало, что вызов CloseHandle вызывающего абонента был недостаточным для полного закрытия HANDLE. Исправление заключалось в том, чтобы сначала перенести входящую HANDLE, а затем код FILE * мог правильно fclose() FILE *, не нарушая HANDLE вызывающего абонента.
Sample неработающая программа:
#include "stdafx.h"
#include <Windows.h>
#include <io.h>
#include <assert.h>
#include <fcntl.h>
int _tmain(int argc, _TCHAR* argv[])
{
for(int x = 0;x < 1024; x++)
{
HANDLE hFile = CreateFile(L"c:\\temp\\rawdata.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
FILE* pFile = _fdopen(_open_osfhandle((long)hFile, _O_RDONLY | _O_BINARY), "rb");
assert(pFile); // this assert will go off at x=509, because _getstream() only has 512 streams, and 3 are reserved for stdin/stdout/stderr
CloseHandle(hFile);
}
return 0;
}
Я почти подозревает разрешения, связанные проблемы. Запуск в режиме отладки означает повышение? Какая ОС и какая среда разработки? – cfeduke 2008-11-06 02:25:01
Что такое «FILE * __cdecl _getstream» в верхней части вашего сообщения? Кроме того, вам не нужны скобки вокруг «rb». – paxdiablo 2008-11-06 02:53:31