http://soen.kr/lecture/win32api/win32lec.htm 참고!
* 파일 생성 및 쓰기 - CreateFile() 속성 값 GENERIC_WRITE --> memcpy() --> WriteFile() 함수
* 파일 열기 및 읽기 - CreateFile() 속성 값 GENERIC_READ --> ReadFile() 함수
1. 파일 열기 및 읽기 예제
#include <windows.h>#include <tchar.h>LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);HINSTANCE g_hInst;LPWSTR lpszClass=L"ApiBase";int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdParam,int nCmdShow){HWND hWnd;MSG Message;WNDCLASS WndClass;g_hInst=hInstance;WndClass.cbClsExtra=0;WndClass.cbWndExtra=0;WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);WndClass.hInstance=hInstance;WndClass.lpfnWndProc=(WNDPROC)WndProc;WndClass.lpszClassName=lpszClass;WndClass.lpszMenuName=NULL;WndClass.style=CS_HREDRAW | CS_VREDRAW;RegisterClass(&WndClass);hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);ShowWindow(hWnd,nCmdShow);while(GetMessage(&Message,0,0,0)) {TranslateMessage(&Message);DispatchMessage(&Message);}return Message.wParam;}LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam){HDC hdc;PAINTSTRUCT ps;static HANDLE hFile;DWORD dwWritten;WORD wd=0xFEFF;TCHAR strWrite[]=L" 이제 꿈나라로 떠납니다ㅎㅎ";DWORD dwRead;TCHAR strRead[MAX_PATH]; // 읽어들인 문자열을 저장할 버퍼.switch(iMessage){case WM_LBUTTONDOWN: // 마우스 왼쪽 클릭 시hFile=CreateFile(L"FileInOutExx.txt",GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,0,NULL);// 파일을 생성한다. 그 파일은 디버깅파일이 있는 디렉토리의 만들어지며, 이름은 FileInputExx.txt이다. 이것은 쓰기만 가능하며, 공유는 안 된다.// 또한 상속은 하지 않으며, 파일이 없다면 만들어서 기록하며 있다면 내용을 덮어씌운다.memcpy(strWrite, &wd,2);// 유니코드 인식을 위하여 strWrite에 있는 2byte를 &wd(0xFEFF)에 저장.WriteFile(hFile, strWrite, (wcslen(strWrite)+1)*sizeof(TCHAR), &dwWritten, NULL);// 파일의 핸들값을 가지고오며, 두번째에는 입력할 문자열, 그 다음은 입력할 문자열의 크기, 실제로 쓰여진 바이트 수를 리턴하는 DWORD 변수의 포인터,// 마지막은 비동기식 입출력이므로 NULL을 입력.CloseHandle(hFile); // 파일 사용이 끝나면, 사용된 핸들을 종료시키기.return 0;case WM_RBUTTONDOWN: // 마우스 오른쪽 클릭 시hdc=GetDC(hWnd);hFile=CreateFile(L"FileInOutExx.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);// FileInOutExx.txt라는 파일을 읽기모드로 생성하겠다는 의미. 또한, 세 번째 인수가 0이므로 파일은 공유하지 않으며, 이미 생성된 파일을 읽어오는 것이기 때문에 OPEN_EXISTING를 씀.ReadFile(hFile,strRead,wcslen(strRead),&dwRead,NULL);// 읽어올 파일의 핸들을 의미하며, 읽어온 데이터를 strRead 버퍼에 저장하고, 쓰려는 바이트 수 , 실제로 입력한 바이트 수 반환, 비동기식 입력 사용 x 하겠다는 의미.TextOut(hdc,100,100,strRead,wcslen(strRead));// strRead에 담긴 문자열을 (100,100)에 출력하라는 의미.// hdc는 첫번째 인자를 의미하는 것이며,, 사실 몰라,,뭔지 잘,,,ㅎ 그리고 마지막 인자는 strRead에 담긴 문자열의 길이를 나타내는 것.CloseHandle(hFile); // 사용한 핸들 닫아주기.ReleaseDC(hWnd,hdc);return 0;}return(DefWindowProc(hWnd,iMessage, wParam, lParam));}
// FileInOutEx.exe를 실행.
// switch()문에 의거하여, 왼쪽 마우스를 클릭하면 FileInOutExx.txt에 미리 지정한 문자열이 입력됨.
// FileInOutEx.exe를 실행했기 때문에 작업관리자를 보면 FileInOutEx.exe 프로세스가 돌아가는 것을 볼 수 있음.
// 마우스 우클릭을 하면, FileInOutExx.txt에 있는 문자열이 FileInOutEx.exe화면에 찍히는 것을 볼 수 있음.
* TextOut( ) 함수
- 함수 원형
BOOL TextOut(hdc, nXStart, nYStart, lpszString, cbString)
// 모든 함수의 첫 번째 인자인 hdc를 입력, (nXStart, nYStart)는 문자열이 출력될 좌표이며,
lpszString는 출력 문자열을 담고 있는 문자열 포인터, cbString는 출력할 문자열의 크기.
TextOut 함수는 널종료 문자열을 사용하지 않는다!!!!
ex) Text(hdc, 100, 100, "Beautiful Flower", 16);
// Beautiful Flower 라는 16자 길이의 문자열을 (100,100)에 출력하며,
출력에 필요한 기타 정보들은 모두 hdc에서 지정하는 정보를 사용하라는 뜻.
'WIN32 API' 카테고리의 다른 글
WIN32 API- 파일 및 디렉토리 관리 (0) | 2018.12.11 |
---|---|
WIN32 API- 파일 공유 (0) | 2018.12.11 |
WIN32 API- 파일의 입출력 예제1 (0) | 2018.12.07 |
WIN32 API- 파일의 입출력(ReadFile)/(WriteFile) (0) | 2018.12.06 |
WIN32 API- 파일의 입출력(CreateFile) (0) | 2018.12.06 |