Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Файлы


Автор: Sheff 6.8.2006, 18:50
Народ, а как установить связь между HANDLE'ом на файл, открытым с помощью CreateFile и указателем на файловый поток FILE*
Т.е грубо говорят, как переконвертировать HANDLE в FILE* и наоборот ?

Автор: Fixin 6.8.2006, 23:46
Напиши письмо в майкрософт и спроси, как в ядре обернут CreateFile для конвертации дескриптора файла в объект FILE*. Или декомпилируй файл msvcrt.dll - и посмотри как там реализована ф-ция fopen.

Добавлено @ 23:47 
А вообще, можно открыть файл и найти в структурах ядра дескриптор этого файла, но это если для извращенцев.

Автор: Sheff 7.8.2006, 00:17
Fixin, вообще да, похоже стандартного способа не существует, вроде вот это работает для обычных файлов:
Код

extern _CRTIMP void * __pioinfo[]; 
*(long *)(__pioinfo[0]) = hRead; 
fgets(&buff[0], 255, stdin);

Для пайпов не пробовал, но всё-равно это хак smile

Автор: NiJazz 8.8.2006, 15:35
Sheff, уже не первый топик с данной тематикой. Зачем тебе это? smile

Автор: Romikgy 8.8.2006, 15:52

   handle = fileno(stream);
  
Код

typedef struct _iobuf
{
    char*    _ptr;
    int    _cnt;
    char*    _base;
    int    _flag;
    int    _file;////имхо это хендл
    int    _charbuf;
    int    _bufsiz;
    char*    _tmpfname;
} FILE;

Автор: Sheff 8.8.2006, 16:20
NiJazz, нужно smile
Решение нашёл: функция _open_osfhandle.

Romikgy, это не хэндл это номер файла smile

Автор: Romikgy 8.8.2006, 16:26
Sheff, а хендл это что?

Автор: Sheff 8.8.2006, 16:32
Romikgy, грубо говоря указатель на объект ядра, в моём случае это файл

Автор: Romikgy 8.8.2006, 16:36
Цитата(Sheff @  8.8.2006,  15:32 Найти цитируемый пост)
грубо говоря указатель на объект ядра,

очень грубо!
имхо тогда лучше _get_osfhandle

Автор: Sheff 8.8.2006, 16:57
Romikgy, почему очень грубо.
HANDLE это void* - т.е указатель, но по нему нельзя обратиться и нельзя разименовать. Видимо винда использует его по-своему, может это какой-нибудь адрес в таблице дескрипторов или ещё что-нибудь, не важно, но это явно не _iobuf::_file.

Кстати, где можно прочитать про то что такое HANDLE в действительности ? Интересно стало smile

Автор: dumb 8.8.2006, 17:20
Sheff, http://book.itzero.com/read/microsoft/0507/Microsoft.Press.Microsoft.Windows.Internals.Fourth.Edition.Dec.2004.internal.Fixed.eBook-DDU_html/0735619174/ch03lev1sec2.html#ch03lev3sec16

Автор: Sheff 8.8.2006, 19:10
dumb, спасибо, почитал. Интересно.
Жаль что на сайте у sysinternals нет исходника WinObj, очень хотелось бы глянуть smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)