1. CopyFile()

// 파일 그 자체를 복사 


BOOL CopyFile(

LPCTSTR lpExisitingFileName, // 복사할 원본파일 이름 

LPCTSTR lpNewFileName, // 복사하여 새로 생성될 파일의 이름 

BOOL bFailIfExists // 새로 생성될 파일이 이미 있을 경우의 동작을 지정 

);                            TRUE -> 실패를 리턴, FALSE -> 기존 파일을 덮는다. 




#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;
TCHAR strTemp[128];
DWORD dwRead;
TCHAR strRead[MAX_PATH]; // 읽어들인 문자열을 저장할 버퍼.
switch(iMessage)
{
case WM_RBUTTONDOWN: // 마우스 오른쪽 클릭 시
hdc=GetDC(hWnd);
SetCursor(LoadCursor(NULL,IDC_WAIT));
CopyFile(L"FileInOutExx.txt",L"C:\\Documents and Settings\\hn\\My Documents\\Visual Studio 2008\\Projects\\FileInOutEx\\FileInOutExx7.txt",FALSE);
// 파일 자체를 복사하는 함수이며, 첫 번째 인자는 원본 파일 이름, 새로 만드는 파일의 경로 및 이름, 마지막 인자는 새로 생성될 파일이 이미 있을 경우 동작을 지정하는 것이다.
// FALSE일 경우, 기존 파일을 덮어쓰고 TRUE일 경우, 실패를 리턴한다.
wsprintf(strTemp, L"%s 을 %s로 복사 하였습니다.",L"FileInOutExx.txt",L"FileInOutExx7.txt");
// 서식화된 출력을 문자열 버퍼로 보내는 것. 즉, 화면에 출력하는 것이 아니라 버퍼에 출력하는 것.
TextOut(hdc,100,100,strTemp,wcslen(strTemp));
// 문자열 출력 함수 ( strTemp에 담긴 문자열을 좌표 100,100에 뿌려주는 함수, wcslen(strTemp)는 뿌리는 문자열의 길이를 지정한 것이며, hdc는,, 말그대로 hdc라네...........?
SetCursor(LoadCursor(NULL,IDC_WAIT));
ReleaseDC(hWnd,hdc);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage, wParam, lParam));
}






















// FileInOutEx.exe를 실행. 


// 마우스 우클릭



// 코드에서 지정한 경로에 가보면, FileInOutExx7.txt가 생긴 것을 볼 수 있다. 





2. CopyFileEx()

// 파일 복사의 진행량과 같은 중간과정을 확인하기 위해서 사용하는 함수 

// 콜백 함수를 등록하여 주기적으로 호출이 가능함.


BOOL CopyFile(

LPCTSTR lpExisitingFileName, // 복사할 원본파일 이름 

LPCTSTR lpNewFileName, // 복사하여 새로 생성될 파일의 이름 

LPROGRESS_ROUTINE lpProgressRoutine, // 콜백함수 주기적 호출(파일의 복사과정 볼 수 있음)

LPVOID lpData, // 콜백함수 호출 시 들어갈 인수 값 (특별한 경우 아니면 0)

LPBOOL pbCancel, // TRUE 이면 복사 중지, FALSE이면 복사 진행 (복사 진행여부)

DWORD dwCopyFlags // 파일을 복사 수행시 옵션 플래그 (특별한 경우 아니면 0) 

);


DWORD CALLBACK CopyProgressRoutine(
LARGE_INTEGER TotalFileSize, // 총 파일 크기(bytes)
LARGE_INTEGER TotalBytesTransferred, // 소스 파일에서 대상 파일로 이동한 총 파일 크기(bytes)
LARGE_INTEGER StreamSize, // 현재 파일 스트림의 총 크기(bytes)
LARGE_INTEGER StreamBytesTransferred, // 소스 파일에서 대상 파일로 이동한 총 파일 스트림 크기(bytes)
DWORD dwStreamNumber, // 현재의 스트림 넘버
DWORD dwCallbackReason, // 함수 호출의 이유
HANDLE hSourceFile, // 원본 파일의 핸들
HANDLE hDestinationFile, // 대상 파일의 핸들
LPVOID lpData) // CopyFileEx 와 MoveFileWithProgress 함수 호출 시 파라미터
#include <windows.h>
#include <tchar.h>
#define _WIN32_WINNT 0x0500 // copyFileEx 사용시 필수 요소
DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TotalFileSize, LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamBytesTransferred,
DWORD dwStreamNumber, DWORD dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID lpData)
// CopyFileEx 와 MoveFileWithProgress 함수 실행시 사용할 수 있도록 정의된 콜백함수.
{
HDC hdc;
TCHAR str[MAX_PATH];
HWND g_hWnd='\0'; // 널값으로 초기화 (여기서 애먹음..ㅎㅎ 어디서 선언해야할까를 고민했고,, 선언했는데 디버깅 에러나서 애먹고,, 선언을 하고 널로 초기화를 하니 문제 해결!)
hdc=GetDC(g_hWnd);
wsprintf(str,L"%d 중 %d 바이트 복사중......",TotalFileSize.LowPart, TotalBytesTransferred.LowPart);
TextOut(hdc,100,100,str,wcslen(str)); // str에 담긴 문자열을 100,100 좌표에 출력
ReleaseDC(g_hWnd,hdc);
return PROGRESS_CONTINUE;
}
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;
TCHAR strTemp[128];
DWORD dwRead;
TCHAR strRead[MAX_PATH]; // 읽어들인 문자열을 저장할 버퍼.
switch(iMessage)
{
case WM_RBUTTONDOWN: // 마우스 오른쪽 클릭 시
hdc=GetDC(hWnd);
SetCursor(LoadCursor(NULL,IDC_WAIT));
//CopyFile(L"FileInOutExx.txt",L"C:\\Documents and Settings\\hn\\My Documents\\Visual Studio 2008\\Projects\\FileInOutEx\\FileInOutExx7.txt",FALSE);
//wsprintf(strTemp, L"%s 을 %s로 복사 하였습니다.",L"FileInOutExx.txt",L"FileInOutExx7.txt");
//TextOut(hdc,100,100,strTemp,wcslen(strTemp));
CopyFileEx(L"ulala.mp4",L"C:\\Documents and Settings\\hn\\My Documents\\Visual Studio 2008\\Projects\\FileInOutEx\\parkseungil.mp4",
LPPROGRESS_ROUTINE(CopyProgressRoutine),0,FALSE,0);
//ulala.mp4의 파일을 지정된 경로에 parkseungil.mp4로 저장시키기. 콜백함수를 주기적으로 호출하여 파일의 복사과정을 볼 수 있게 해주는게 CopyProgressRoutine이며, 자동형변환이 되지 않아
// 강제적으로 LPPROGRESS_ROUTINE()로 맞춰주었다. 또한, 이것은 복사를 진행하기위해 FALSE를 사용하였다.TRUE라면 복사를 중지한다. 3번째, 5번째의 인자는 각각 콜백함수 호출 시 인수 값과
// 복사 수행시 옵션 플래그값을 의미하며 특수한 경우가 아니라면 0을 적는다.
MessageBox(hWnd,L"파일 복사가 완료 되었습니다.",L"알림",MB_OK);
SetCursor(LoadCursor(NULL,IDC_WAIT));
ReleaseDC(hWnd,hdc);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage, wParam, lParam));
}
// ulala.mp4를 복사할 예정


// FileInOutEx.exe를 실행 -> 우클릭 -> 파일 복사

(복사되는 진행상황을 볼 수 있다)


// 지정된 경로에 parkseungil.mp4로 파일이 있는 것을 볼 수 있다.




1. 파일 공유 예제

- 파일 공유 허용범위를 지정하기 위해선 CreateFile() 사용.



#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,FILE_SHARE_READ,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));
//CloseHandle(hFile); // 사용한 핸들 닫아주기.
ReleaseDC(hWnd,hdc);
return 0;
case WM_DESTROY:
if(hFile)
CloseHandle(hFile);
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage, wParam, lParam));
}


// 빨간색 글씨를
0 -> FILE_SHARE_READ로 변경하면 파일공유 가능






// 변경 전



// 변경 후





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에서 지정하는 정보를 사용하라는 뜻.





1. 파일 생성 및 쓰기 예제 



#include <windows.h>
#include <tchar.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); // 윈도우 메시지를 처리하는 WndProc()함수
HINSTANCE g_hInst;
LPWSTR lpszClass=L"ApiBase";
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow) // 윈도우 자체를 생성하는 WinMain()함수
{
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" 문자열을 파일에 씁니다.";
switch(iMessage)
{
case WM_LBUTTONDOWN:
hFile=CreateFile(L"FileInOutExx.txt",GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,0,NULL);
// 파일을 생성한다. 그 파일은 디버깅파일이 있는 디렉토리의 만들어지며, 이름은 FileInputExx.txt이다. 이것은 쓰기만 가능하며, 공유는 안 된다.
// 또한 상속은 하지 않으며, 파일이 없다면 만들어서 기록하며 있다면 내용을 덮어씌운다.
memcpy(strWrite, &wd,2); // 유니코드 인식을 위해 작성할 문자배열의 2byte를 0xFFEF에 넣는다.
WriteFile(hFile, strWrite, (wcslen(strWrite)+1)*sizeof(TCHAR), &dwWritten, NULL);
// 데이터를 읽어와서 쓴다. hFile은 CreateFile() 함수로부터 생성한 파일 핸들 값이 들어가게 되며, 두번째에는 입력할 문자열,
// 세번째에는 입력할 문자열의 크기, 그 다음은 실제로 쓰여진 바이트 수를 리턴하기 위해 DWORD 변수의 포인터가 들어가며, 마지막엔 비동기식 입출력을 NULL로 한 것이다.
CloseHandle(hFile); // 파일 사용이 끝나면 파일 닫기
return 0;
}
return(DefWindowProc(hWnd,iMessage, wParam, lParam));
}





















// 디버깅 후, FileInOutEx.exe 실행 -> 마우스 왼쪽 클릭 


// 그러면 FileInOutExx.txt가 생성된다. 

또한, 그것을 열어보면 아까 코드에 있던 strWrite[]의 내용이 적혀있는 것을 볼 수 있다. 




* memcpy() 함수 

// memory copy라는 의미로, 메모리의 내용을 바이트단위로 다른 곳에 복사해주는 함수. 


- 함수 원형 

memcpy(목적지포인터, 원본포인터, 크기);

void *memcpy(void*_Dst, void const*_Src, size_t_Size);


ex) memcpy(strWrite, &wd, 2);

// 문자열 변수인 strWrite의 처음 2byte를 &wd(0xFEFF)에 입력시키기. 

왜?? 유니코드로 제대로 인식하기 위해.  




'WIN32 API' 카테고리의 다른 글

WIN32 API- 파일 공유  (0) 2018.12.11
WIN32 API- 파일의 입출력 예제2  (0) 2018.12.08
WIN32 API- 파일의 입출력(ReadFile)/(WriteFile)  (0) 2018.12.06
WIN32 API- 파일의 입출력(CreateFile)  (0) 2018.12.06
WIN32 Programming  (0) 2018.12.06

2. ReadFile( )

// 파일로부터 데이터를 읽어오는 함수


BOOL ReadFile (

  HANDLE hFile, // 읽으려는 파일의 핸들

  LPVOID lpBuffer, // 읽어 온 데이터를 저장할 버퍼의 포인터

  DWORD nNumberOfBytesToRead, // 읽으려는 바이트의 수 

  LPDWORD lpNumberOfBytesRead, // 실제로 읽은 바이트 수를 반환 받기 위한 출력용 인수

  LPOVERLAPPED lpOverlapped // 비동기 입출력을 위한 OVERLAPPED 구조체의 포인터 (비동기 사용X -> NULL)

);



#예제1 - 파일의 맨 처음부터 읽기.

- test.txt 파일을 없으면 만들고, 있으면 덮어씌워서라도 열어라.

- 읽기 위해서

- 딴놈이 읽는 것까지는 허용

- 일반 파일 속성

- 함수 사용 예제


DWORD rbytes; // 실제로 읽은 바이트 수를 반환받기 위한 출력용 인수 선언

char buff[100]; // 읽어 온 데이터를 저장할 버퍼의 포인터 선언 

HANDLE hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ, 

                     NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);

ReadFile(hFile, buff, sizeof(buff), &rbytes, NULL);



# 예제2 - 원하는 위치부터 읽기

- 파일의 첫부분에서 100바이트 뒤부터 읽기

- 함수 사용 예제


DWORD rbytes;  // 실제로 읽은 바이트 수를 반환하기 위한 출력용 인수

char buff[100]; // 읽어 온 데이터를 저장할 버퍼의 포인터 선언 

HANDLE hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ, 

                     NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);

SetFilePointer(hFile, 100, NULL, FILE_BEGIN);

ReadFile(hFile, buff, sizeof(buff), &rbytes, NULL);




3. WriteFile( )

// 파일에 데이터를 쓰는 함수 


* 함수 원형


BOOL WriteFile(

HANDLE hFile, // 쓰려는 파일의 핸들

LPCVOID lpBuffer, // 데이터를 쓰기 위해 할당된 버퍼의 포인터

DWORD nNumberOfBytesToWrite, // 쓰려는 바이트 수 

LPDWORD lpNumberOfBytesWritten, // 실제로 쓴 바이트 수를 반환 받기 위한 출력용 인수

LPOVERLAPPED lpOverlapped // 비동기 입출력을 위한 OVERLAPPED 구조체의 포인터(비동기 사용X -> NULL)

);


// 파일 포인터가 가리키고 있는 지점부터 데이터를 저장하며, 기록이 끝나면 실제 기록한 바이트 수만큼 파일 포인터를 이동해준다. 





'WIN32 API' 카테고리의 다른 글

WIN32 API- 파일 공유  (0) 2018.12.11
WIN32 API- 파일의 입출력 예제2  (0) 2018.12.08
WIN32 API- 파일의 입출력 예제1  (0) 2018.12.07
WIN32 API- 파일의 입출력(CreateFile)  (0) 2018.12.06
WIN32 Programming  (0) 2018.12.06

1. CreateFile( ) 

// 파일 생성, 열기 


* 함수의 원형


HANDLE CreateFile(

LPCTSTR lpFileName, 

DWORD dwDesiredAccess, 

DWORD dwShareMode, 

LPSECURITY_ATTRIBUTES lpSecurityAttributes,  

DWORD dwCreationDisposition, 

DWORD dwFlagsAndAttributes,  

HANDLE hTemplateFile 

);



1) LPCTSTR lpFileName

// 생성하고자 하는 파일명, 파일의 절대경로를 나타냄. 또, 'COM1'이라 쓰면 COM1포트 개방.


2) DWORD dwDesiredAccess 

// 파일의 접근 권한 지정 (0, GENERIC_READ, GENERIC_WRITE)

  읽고 싶은지 쓰고 싶은지 아니면 둘다인지


3) DWORD dwShareMode

 // 파일의 공유 모드 지정 (FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_DELETE, 0)

    내가 열어서 사용하고 있는데 딴 놈이 접근하면 어떻게 하지? 아무도 열지 못하게 할 수도, 읽기만 허용, 

    쓰기 허용, 삭제 허용  


4) DWORD dwCreationDisposition

// 파일을 생성할 것인지 열 것인지 지정, 만들지 열지 

 CREATE_NEW : 파일을 새로 만든다. 기존에 파일이 있다면 에러를 반환. 

 CREATE_ALWAYS : 항상 파일을 새로 만든다. 기존에 파일이 있다면 덮어쓰기.

 OPEN_EXISTING : 기존 파일을 연다. 만약 열려있는 파일이 없다면 에러를 반환

 OPEN_ALWAYS : 파일을 연다. 열려는 파일이 없는 경우에는 직접 파일을 생성하여 파일을 열기.


5) LPSECURITY_ATTRIBUTES lpSecurityAttributes

// 파일의 보안 속성을 지정하는 구조체 포인터 

    자식한테 상속할까? 상속할 마음 없으면 그냥 NULL하자. 


6) DWORD dwCreationDisposition

// 파일을 생성할 것인지 열 것인지 지정.


 7) DWORD dwFlagsAndAttributes

 //생성할 파일의 속성 또는 기타 객체의 속성을 지정.

  FILE_ATTRUBUTE_ARCHIVE : 쓰기 속성으로 생성.

  FILE_ATTRUBUTE_ENCRYPTED : 파일을 암호화하여 생성.

  FILE_ATTRUBUTE_HIDDEN : 숨김 파일로 생성.

  FILE_ATTRUBUTE_NORMAL : 아무런 속성도 없는 파일을 생성.

  FILE_ATTRUBUTE_NOT_CONTENT_INDEXED : 콘텐츠 인덱싱 서비스에 대해 인덱스되지 않도록 한다.

  FILE_ATTRUBUTE_OFFLINE : 데이터가 오프라인 상태로 즉시 사용 불가.

  FILE_ATTRUBUTE_READONLY : 읽기 전용 속성으로 생성.

  FILE_ATTRUBUTE_SYSTEM : 시스템 파일로 생성.

  FILE_ATTRUBUTE_TEMPORARY : 임시 파일로 생성.


8) HANDLE hTemplateFile 

// 새로 만들 파일의 속성을 제공할 템플릿 파일, 필요없어 쓰지마. 




#예제1

- 파일에 내용을 쓰기 목적으로 열기

- 다른 프로세스가 열어서 읽는 것까지는 허용

- 파일이 없으면 만들어서 열고 있으면 실패

- 함수 사용 예제

HANDLE hFile;

hFile = CreateFile("c:\\test.txt", GNERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW,                                                     FILE_ATTRIBUTE_NORMAL, NULL);



#예제2

- 파일이 있으면 열고 없으면 새로 만들어서 열기

- 파일에 내용을 읽기 목적으로 열기

- 함수 사용 예제

HANDLE hFile;

hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ, NULL

                         ,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);


# CreateFile 예제3

- 파일이 있으면 열고 없으면 실패

- 함수 사용 예제

HANDLE hFile;

hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_WRITE, NULL

                          , OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);




'WIN32 API' 카테고리의 다른 글

WIN32 API- 파일 공유  (0) 2018.12.11
WIN32 API- 파일의 입출력 예제2  (0) 2018.12.08
WIN32 API- 파일의 입출력 예제1  (0) 2018.12.07
WIN32 API- 파일의 입출력(ReadFile)/(WriteFile)  (0) 2018.12.06
WIN32 Programming  (0) 2018.12.06

1.  Virtual C++ 2005     

- 디버그 모드

// 디버깅하기 위한 컴파일 모드. 실행파일 중간에 디버그 정보를 삽입하여 디버깅 정보를 볼 수 있게 하며, 브레이크 포인트를 걸어서 실행 중간 과정을 확인 할 수 있음. 디버깅 정보가 들어가 실행파일의 크기는 크다.


- 릴리즈 모드

// 배포하기 위한 컴파일 모드. 컴파일 시에는 디버그 정보가 모두 빠지고, 코드 또한 최적화되므로 실행 파일의 크기는 작은 편이다. 



2. WIN 32 Data type


 자료형

 의미 

 BYTE 

 unsigned char형

 WORD 

 unsigned short형

 DWORD

 unsigned long 형

 LONG 

 long형과 같다.

 LPSTR

 char*형과 같다.(포인터)

 BOOL

 정수형이며 TRUE 혹은 FALSE 값을 갖는다. 



3. 인수와 매개변수 

- 매개변수

// 함수 내부에서 사용되는 변수. 즉, 불리워진 함수 내부에서 사용하는 변수.


- 인수

// 함수 밖에서 함수를 호출할 때 사용되는 변수. 즉, 함수를 부르는 쪽에서 사용하는 변수 


int multiple (int a, int b)

{

int nret;

nret=a*b;

return nret;

}


void main()

{

int k,m,n;

k=multiple(m,n);

}


// a,b는 매개변수, m,n은 인수. 



4. Vitual C++ 2005 시작 // win xp에서 실행. 

Win 32 -> Win 32 프로젝트 


Windows 응용프로그램, 빈 프로젝트 체크 후 마침.


소스파일 추가 -> 새 항목 -> 코드 -> c++파일(.cpp) 



5. 함수의 기본 구조 // 반드시 있어야 할 함수!! 


(1) WinMain() 함수 // 프로그램의 윈도우 자체를 생성만 함.


WinMain()
{
윈도우_클래스_만들기
윈도우_객체_생성하기
윈도우_객체_화면에_띄우기
메시지_루프_돌리기

}

- WinMain() 함수의 원형

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,
int nCmdShow)

// hInstance : 현재 실행되고 있는 프로그램의 인스턴스 핸들
hPrevlnstance : 바로 앞에 실행된 프로그램의 인스턴스 핸들, 통상 NULL 값을 준다.
lpCmdLine : 명령행 인자. main 함수의 argv에 해당.
nCmdShow : 윈도우를 보여주는 형태의 플래그.


* 인스턴스 핸들
// 메모리에 생성된 클래스의 실체.
예를 들면, 내 방에 있는 컴퓨터, 책상, 스탠드 등을 클래스라 할 수 있으며, 이 물건들을 활용한다면 메모리에 생선한다고 말할 수 있다.
내 방에 컴퓨터는 존재한다( 클래스가 존재한다 ) 내가 컴퓨터의 전원을 켠다 (메모리에 클래스를 생성한다) 존재의 가치가 있으려면 메모리가 생성되어야한다.
각 프로그램마다 고유하다.

* 핸들
// 레이블과 같은 것으로, 대상을 식별하는데 주로 사용.
- 접두어 h로 시작하며, 정수형 32bit이다.
- 핸들은 운영체제가 발급하며 사용자는 핸들을 쓰기만 하면 된다.
- 같은 종류의 핸들끼리는 절대 중복된 값을 가지지 않는다.


< 윈도우 생성을 위해서 > // WinMain()함수
1. 윈도우 클래스 생성 // 구조체 이용
2. 윈도우 객체 생성 // 클래스 이용
3. 윈도우 화면에 출력
4. 입력장치로부터 입력신호를 받음(메시지 루프)
// 메시지 루프로부터 전달 받은 윈도우 메시지를 처리 // WndProc()함수

(2) WndProc() 함수 // 실제 일어나는 윈도우 메시지를 처리 ( 윈도우 프로시져 = 윈프록 )

WndProc()
{
전달된_메시지_처리하기


}


+ Recent posts