#include "stdafx.h"
#include <windows.h>
#include <process.h>
struct MyOVERLAPPED:public OVERLAPPED
{
public:
char * pBuff;
int nIndex;
MyOVERLAPPED();
MyOVERLAPPED(int nSize, int nFileOffsetLow, int nFileOffsetHeight = 0);
~MyOVERLAPPED();
};
VOID WINAPI OverlappedCompliteFun(
DWORD dwErrorCode,
DWORD dwNumberOfBytesTransfered,
LPOVERLAPPED lpOverlapped
)
{
MyOVERLAPPED* pMyOverlapped = (MyOVERLAPPED*)lpOverlapped;
printf("[%d]IO任务完成,读取字节:%d,读取位置:%d,读取内容:[%s]\n",pMyOverlapped->nIndex,pMyOverlapped->Internal,pMyOverlapped->Offset,pMyOverlapped->pBuff);
delete pMyOverlapped;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFile = CreateFile(L"1.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if (hFile == INVALID_HANDLE_VALUE)return 0;
int nFileRead = 50;
int nReadPos = 0;
MyOVERLAPPED * vo = new MyOVERLAPPED(nFileRead,nReadPos);
vo->nIndex = 0;
ReadFileEx(hFile, vo->pBuff, nFileRead, vo, OverlappedCompliteFun);
nFileRead = 80;
nReadPos = 500;
MyOVERLAPPED * vo2 = new MyOVERLAPPED(nFileRead,nReadPos);
vo2->nIndex = 1;
ReadFileEx(hFile, vo2->pBuff, nFileRead, vo2, OverlappedCompliteFun);
SleepEx(3, TRUE);
system("pause");
return 0;
}
MyOVERLAPPED::MyOVERLAPPED() :pBuff(nullptr)
{
OVERLAPPED::hEvent = 0;
}
MyOVERLAPPED::MyOVERLAPPED(int nIoSIze, int nFileOffsetLow, int nFileOffsetHeight)
{
OVERLAPPED::hEvent = 0;
OVERLAPPED::Offset = nFileOffsetLow;
OVERLAPPED::OffsetHigh = nFileOffsetHeight;
pBuff = new char[nIoSIze]{};
}
MyOVERLAPPED::~MyOVERLAPPED()
{
if (pBuff != nullptr)
{
delete[] pBuff;
pBuff = nullptr;
}
}