SW 개발

[win32API] CreateFile() ReadFile() WriteFile() 사용예제

. . . 2013. 3. 27. 08:34
반응형
  • 출처 : 나, from 연습용소스...

예제 소스코드

CreateFile()

  • 시리얼 open시.. 이때 nonoverlap으로;;
if ((m_tHandle.hSerialDev = CreateFile(lpPortName, GENERIC_READ | GENERIC_WRITE, 
                                       0, // exclusive access 
                                       NULL, // no security attrs 
                                       OPEN_EXISTING, 
                                       FILE_ATTRIBUTE_NORMAL , // overlapped I/O 
                                       NULL)) == INVALID_HANDLE_VALUE)
{
     m_tHandle.hSerialDev = NULL;
     WriteToDebugFile(_T("Serial_Msg : CreateFile() Fail..\r\n"));
     return FALSE;
}

일반파일 open

hLogFileHandler = CreateFile(szCurTempFullFileName, GENERIC_READ | GENERIC_WRITE, 
                             0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);

ReadFile()

데이터 한번에 못읽었을때 옵션추가..

DWORD SerialComm::SerialRead(LPSTR lpszBlock, DWORD dwMaxLength)
{
    DWORD dwToRead;
    DWORD iLengthTemp=0;
....

    if (dwRead >= 1)
    {   // 한번에 다 못읽으면 포인터 옮기면서 버퍼에 저장, 버퍼길이는 계속 줄어듬..
        ReadFile(m_tHandle.hSerialDev, (lpszBlock+iLengthTemp), 
                (dwMaxLength-iLengthTemp), &dwToRead, 0); // 블럭단위로 꺼내옴
        iLengthTemp+=dwToRead;  // 여러번 읽어와도 최종 길이만 리턴..
    }
....
}

WriteFile()

바이트단위 라이팅.. (오류체크 제외..)

BOOL SerialComm::SerialWrite(TCHAR* lpByte) 
{
    BOOL fWriteStat ; 
    DWORD nToWrite , dwWrite;

    nToWrite = _tcslen(lpByte);

    fWriteStat = WriteFile(m_tHandle.hSerialDev,lpByte,nToWrite*sizeof(TCHAR),&dwWrite,NULL);
    if (!fWriteStat) 
    { 
        WriteToDebugFile(_T("Serial_Msg : Write -> WriteFile() Fail..\r\n"));
        return FALSE;
    } 
    return TRUE; 
}

CString을 유니코드 환경에서의 writefile()

// CString ==> char* 변환시작..
nToWrite = m_valEditWrite.GetLength();
TCHAR * szpTempBuff = new TCHAR[nToWrite + 1];  // 1은 NULL을 위한 여유공간
_tcscpy(szpTempBuff, m_valEditWrite.GetBuffer(0));

if(WriteFile(m_hFckHandle, szpTempBuff, nToWrite*sizeof(TCHAR), &dwWriten, 0))
{
    CString CstringTemp;
    // 성공하면..
    CstringTemp.Format(_T("Write : %s [%d]\r\n"), szpTempBuff, dwWriten);
    WriteToStatusEditControl(CstringTemp);
}
else
{
    WriteToStatusEditControl(_T("ERROR : Write fail!!!\r\n"));
}
반응형