Большой Воронежский Форум
» Программирование>WINAPI & ReadFileEx();
MHC 13:04 08.06.2004
Народ!!!! Помогите плz!!!

Надо организовать асинхронный ввод-вывод.

Делаю следующее:

in_file=CreateFile(full_name,GENERIC_READ,0, 0, OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);

DWORD n=1;//определяет, размер блоков, которыми будет читать файл

char buff8[1];//8-ми битный буффер
DWORD counter=0;
OVERLAPPED inf;
inf.Offset=counter;
inf.OffsetHigh=counter;

do
{
err=ReadFileEx(in_file,buff8,n,(LPOVERLAPPED)&inf, &FileReadingComplete);

if (!err)//если ф-я возвратила FALSE
{
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );

MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Read_IN_File", MB_OK | MB_ICONERROR);


и тут мне мессаж бокс говорит о том, что, мол "Сетевой запрос не поддерживается"

}

/****************/

Кто что скажет/ подскажет?
Может, если кому приходилось с этим иметь дело, сырцами поделится?

MHC добавил [date]1086689283[/date]:
кста, забыл...


еще есть такая функция:

VOID CALLBACK FileReadingComplete(DWORD dwErrorCode,DWORD dwNumberOfBytesTransfered,LPOVERLAPPED lpOverlapped)
{
MessageBox(NULL,"клево","Message",MB_OK);
}
[Ответ]
zss_vrn 12:38 09.06.2004
Повторил этот код - у меня работает. Только CALLBACK вызывается, если применять SleepEx или WaitForSingleObjectEx после ReadFileEx.

Win 2000 SP 3 prof.

Это НЕ должно работать на Win98-ME.

inf, in_file должны быть глобальными.

zss_vrn добавил [date]1086774063[/date]:
Файл - в текущей директории.

zss_vrn добавил [date]1086774228[/date]:
HANDLE in_file = NULL;
OVERLAPPED inf;
char *full_name = "test.txt";
char buff8[10];// áèòíûé áóôôåð

VOID CALLBACK FileReadingComplete(DWORD dwErrorCode,DWORD dwNumberOfBytesTransfered,LPOVERLAPPED lpOverlapped)
{
CloseHandle(in_file);
ShowMessage((int)dwNumberOfBytesTransfered);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
in_file=CreateFile(full_name,GENERIC_READ | STANDARD_RIGHTS_ALL ,0, 0, OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
DWORD n=5;//îïðåäåëÿåò, ðàçìåð áëîêîâ, êîòîðûìè áóäåò ÷èòàòü ôàéë
inf.Offset=0;
inf.OffsetHigh=0;

int err = ReadFileEx(in_file,buff8,n,(LPOVERLAPPED)&inf, &FileReadingComplete);

LPVOID lpMsgBuf;

if (!err){//åñëè ô-ÿ âîçâðàòèëà FALSE
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );

Application->MessageBox((LPCTSTR)lpMsgBuf, "Read_IN_File", MB_OK | MB_ICONERROR);
LocalFree( lpMsgBuf );

} else
ShowMessage("OK");

SleepEx( 10, TRUE);

}
//--------------------------------------------------------------------------- [Ответ]
MHC 16:51 09.06.2004

Сообщение от :
Первоначальное сообщение от zss_vrn
[B]
Повторил этот код - у меня работает. Только CALLBACK вызывается, если применять SleepEx или WaitForSingleObjectEx после ReadFileEx.

Win 2000 SP 3 prof.
Это НЕ должно работать на Win98-ME.

Да. Эт верно. Я когда почитал MSDN получше, так и вычитал, что на мастдаище с файлами асинхронный I/O не работает.

Сообщение от :
inf, in_file должны быть глобальными.

Может быть и должны, но не обязаны. У меня - локальные и все работает.

Спасибо за помощь. [Ответ]
fishca 08:34 10.06.2004
MHC
Windows 95: hFile can be a communications resource, mailslot, or named pipe handle opened with the FILE_FLAG_OVERLAPPED flag by CreateFile, or a socket handle returned by the socket or accept functions. Windows 95 does not support asynchronous operations on disk files. [Ответ]
netwind 10:04 11.06.2004
а зачем вам асинхронный ввод-вывод ?
вы таки не любите треды?
а может вы антисемит ? [Ответ]
MHC 13:47 11.06.2004

Сообщение от :
Первоначальное сообщение от netwind
а зачем вам асинхронный ввод-вывод ?
вы таки не любите треды?
а может вы антисемит ?

сессия, понимаешь, курсовые [Ответ]
Вверх