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로 변경하면 파일공유 가능






// 변경 전



// 변경 후





+ Recent posts