MFC/Microsoft Foundation Class 2011. 3. 2. 12:06

Stream은 하나의 관을 통해 일렬로 데이터를 전달하기 떄문에 비트들의 연속으로 구성된 기본 자료형 데이터를 Stream에 전달하는 것은 어렵지 않다.
하지만 데이터의 집합으로 구성된 객체를 스트림에 출력하려면 객체를 구성하는 데이터를 일렬로 배열시킨뒤 스트림에 기록해야 한다. 객체를 일렬로 배열시키는 작업을 직렬화(Serialize)라 한다.

:
MFC/Microsoft Foundation Class 2011. 2. 11. 16:07
WINSHELLAPI int WINAPI SHFileOperation(
    LPSHFILEOPSTRUCT lpFileOp	
);	



- 복사, 이동, 이름을 변경, 또는 파일 시스템 개체 삭제합니다.

- 성공시 0을 반환, 그렇지 아니면 0이 아닌수가 반환

[lpFileOP]
SHFILEOPSTRUCT구조체의 주소를 인자로 받는다
:
MFC/Microsoft Foundation Class 2011. 2. 11. 15:59
typedef struct _SHFILEOPSTRUCT {

    HWND  hwnd;                 // 윈도우 핸들

    UINT  wFunc;                // 실행하는 조작

    LPCTSTR  pFrom;             // 대상 파일명

    LPCTSTR  pTo;               // 목적 파일명

    FILEOP_FLAGS  fFlags;       // 플래그

    BOOL fAnyOperationsAborted; // 결과

    LPVOID  hNameMappings;      // 파일명 매핑 오브젝트

    LPCTSTR lpszProgressTitle;  // 다이얼로그의 타이틀

} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;

SHFileOperation 함수가 행하는 파일 조작에 관한 정보가 격납됩니다.

000 

멤버

hwnd

파일 조작의 상황을 표시하는 다이알로그 박스의 오너 윈도우의 핸들을 지정합니다.

wFunc

실행하는 파일 조작을 나타내는 값을 지정합니다.이하의 값중 한쪽이 격납됩니다.

의미

0x0001 (FO_MOVE)

pFrom 멤버로 지정된 파일을 pTo 멤버로 지정된 위치로 이동합니다.

0x0002 (FO_COPY)

pFrom 멤버로 지정된 파일을 pTo 멤버로 지정된 위치에 카피합니다.

0x0003 (FO_DELETE)

pFrom 멤버로 지정된 파일을 삭제합니다.

0x0004 (FO_RENAME)

pFrom 멤버로 지정된 파일의 이름을 pTo 멤버로 지정된 파일명으로 변경합니다.이 플래그를 사용하고, 한 번의 함수 호출로 복수의 파일의 이름을 변경할 수 없습니다.복수의 파일의 이름을 변경하려면 FO_MOVE 플래그를 사용합니다.

pFrom

조작의 대상이 된다1개이상의 파일명이 격납된 버퍼의 주소를 지정합니다.이러한 파일명은 풀 패스 지정되어 있지 않으면 안됩니다.파일명에 “*” 등의, 표준MS-DOS와일드 카드를 지정할 수 있습니다.

각각의 파일명은1개의 눌 문자로 단락지어지지 않으면 안됩니다., 마지막 파일명의 뒤에는2개의 눌 몬지를 들어갈 수 있지 않으면 안됩니다.

pTo

카피·이동처 디렉토리명 또는 변경 후의 파일명이 격납된 버퍼의 주소를 지정합니다.이 멤버를 사용하지 않는 경우에는 0 (NULL) ()를 지정하지 않으면 안됩니다.

카피 또는 이동의 조작에 대하고, pFrom 멤버와 같은 방법으로 복수의 파일을 지정할 수 있습니다.이 경우, 각각의 파일명은1개의 눌 문자로 단락지어, 마지막 파일명의 뒤에는2개의 눌 몬지를 들어갈 수 있지 않으면 안됩니다.복수의 파일명을 지정하려면 , fFlags 멤버에 FOF_MULTIDESTFILES 플래그를 지정합니다.

카피 또는 이동의 조작에 대하고, 존재하지 않는 디렉토리를 지정할 수 있습니다.이 때, 시스템은 디렉토리의 작성을 시도합니다만, 통상은, 다이알로그 박스를 표시해 새로운 디렉토리를 작성할지를 유저에게 확인합니다.파일 조작중에 다이알로그 박스를 표시하지 않게 하려면 , fFlags 멤버에 FOF_NOCONFIRMMKDIR 플래그를 지정합니다.

파일명에 와일드 카드 문자를 사용할 수 없습니다., 파일명은 풀 패스 지정되어 있지 않으면 안됩니다.상대 패스를 사용하면, 예기치 않은 결과를 일으킬 가능성이 있습니다.

fFlags

파일 조작을 제어하는 옵션 플래그를 지정합니다. 0 또는 이하의 값을 조합해 지정합니다.

의미

0x0001 (FOF_MULTIDESTFILES)

pTo 멤버가 복수의 파일명을 지정해 있는 것을 나타냅니다.

0x0002 (FOF_CONFIRMMOUSE)

현재는 사용되지 않습니다.

0x0004 (FOF_SILENT)

경과를 나타내는 다이알로그 박스를 표시하지 않습니다.

0x0008 (FOF_RENAMEONCOLLISION)

이동, 카피, 이름의 변경의 조작에 대하고, 지정한 파일명이 벌써 존재하고 있었을 경우에는, 조작 대상의 파일에 새로운 이름을 붙입니다.

0x0010 (FOF_NOCONFIRMATION)

표시되는 다이알로그 박스로 「네」또는 「모두」를 선택하도록(듯이) 합니다.

0x0020 (FOF_WANTMAPPINGHANDLE)

FOF_RENAMEONCOLLISION 하지만 지정되어 있고, 같은 파일명이 존재했기 때문에 새로운 파일명이 붙여졌을 경우에, 낡은 이름과 새로운 이름을 포함한 매핑 오브젝트의 핸들을 hNameMappings 멤버에 격납합니다.

0x0040 (FOF_ALLOWUNDO)

가능한 한 un-do 정보를 보관 유지하도록(듯이) 합니다. pFrom 그리고 지정된 파일명이 풀 패스로 지정되어 있을 필요가 있습니다.삭제시로 지정하면, 파일을 쓰레기통에 넣을 수 있습니다.

0x0080 (FOF_FILESONLY)

와일드 카드 파일명(*.*)()가 지정되었을 경우에게만 조작을 실행합니다.

0x0100 (FOF_SIMPLEPROGRESS)

경과를 나타내는 다이알로그 박스에 파일명을 표시하지 않습니다.

0x0200 (FOF_NOCONFIRMMKDIR)

새로운 디렉토리를 작성할 필요가 있는 경우에, 작성할지의 확인을 하지 않습니다.

0x0400 (FOF_NOERRORUI)

에러가 발생했을 경우에, 유저 인터페이스를 표시하지 않습니다.

0x0800 (FOF_NOCOPYSECURITYATTRIBS)

Version 4.71 이후: 파일의 시큐러티 속성이 카피되지 않게 합니다.

0x1000 (FOF_NORECURSION)

로컬 디렉토리에만 조작을 행합니다.서브 디렉토리에 대해서 재귀적으로 조작을 행하지 않습니다.

0x2000 (FOF_NO_CONNECTED_ELEMENTS)

Windows Me/2000 이후: 그룹으로서 접속되고 있는 파일을 이동하지 않습니다.지정된 파일만을 이동합니다.

0x4000 (FOF_WANTNUKEWARNING)

Windows Me/2000 이후: 쓰레기통에 넣는 것은 아닌 삭제 조작 시에 파일이 삭제될 때 경고를 합니다.

0x8000 (FOF_NORECURSEREPARSE)

Windows XP 이후: 리파스포인트를 컨테이너는 아니고 오브젝트로서 취급합니다.

fAnyOperationsAborted

지정한 파일 조작이 완료하기 전에 유저에 의해서 중지되었을 경우에는 1 (TRUE) 하지만 격납됩니다.그 이외의 경우에는 0 (FALSE) 하지만 격납됩니다.

hNameMappings

이동·카피·이름 변경된 파일의 낡은 파일명과 새로운 파일명을 포함한 파일명 매핑 오브젝트의 핸들이 격납됩니다.이 멤버는 fFlags 멤버에 FOF_WANTMAPPINGHANDLE 플래그가 지정되었을 경우에게만 사용됩니다.이 핸들이 불필요하게 되면 SHFreeNameMappings 함수로 해방하지 않으면 안됩니다.이 핸들에 관해서는, 아래의 해설을 참조해 주세요.

lpszProgressTitle

경과를 표시하는 다이알로그 박스의 타이틀 바에 사용하는 문자열의 주소를 지정합니다. fFlags 멤버로 FOF_SIMPLEPROGRESS 하지만 지정되어 있는 경우에게만 유효합니다.

해설

pFrom 멤버 및 pFrom 멤버가 풀 패스가 아닌 파일명의 경우는, 커런트 디렉토리에 있다고 보입니다.

파일 삭제시에 pFrom 멤버에 풀 패스가 아닌 파일명이 지정되었을 경우는, FOF_ALLOWUNDO 플래그를 지정했을 경우에서도 파일은 쓰레기통에 넣어지지 않습니다.

fFlags 멤버에 FOF_WANTMAPPINGHANDLE 플래그를 지정하면, hNameMappings 멤버에는 파일명 매핑 오브젝트의 핸들이 격납됩니다.이 핸들은, 멤버가 UINT 형태 및 SHNAMEMAPPING 구조체의 배열에의 포인터인 구조체의 포인터로서 취급됩니다.,

struct HANDLETOMAPPINGS {

    UINT           uNumberOfMappings;  // 배열의 요소수

    SHNAMEMAPPING *lpSHNameMapping;    // 배열에의 포인터

};

그렇다고 하는 구조체에의 포인터이다고 합니다(HANDLETOMAPPINGS 구조체는 명시적으로 정의되고는 있지 않습니다).이 때의 UINT 형태의 값으로서 SHNAMEMAPPING 구조체의 배열의 요소수가 세트 됩니다.각각의 SHNAMEMAPPING 구조체에는, 변경되었다1개의 파일이 낡은 패스명 및 새로운 패스명이 격납되고 있습니다.

hNameMappings 멤버의 값으로 해서 취득한 핸들은 SHFreeNameMappings 함수를 사용해 해방하지 않으면 안됩니다.

hNameMappings 멤버에 돌려주어지는 파일명 매핑 오브젝트를 참조하는 경우, Windows 95/98/Me 그럼, SHFileOperation 함수는 ANSI 세트의 SHNAMEMAPPING 구조체를 돌려줍니다만,Windows NT/2000/XP 그럼, SHFileOperation 함수는 ANSI 판의 함수 및 Unicode 판의 함수 모두 Unicode 세트의 SHNAMEMAPPING 구조체를 돌려줍니다.따라서, 모든 버젼의 Windows 그리고 조작시키기 위해서는, Windows 의 버젼을 조사해 조건 나누어 하는 코드를 작성할 필요가 있습니다.

 


:
MFC/Microsoft Foundation Class 2011. 2. 10. 15:29
void CNetwork_FileDlg::OnBtnOPEN() 
{
	TCHAR m_szFolderDisplayName[MAX_PATH] = {0};
	TCHAR m_szFolderPath[MAX_PATH] = {0};
	LPITEMIDLIST m_pidlSelected =NULL;
	
	BROWSEINFOA m_bi;
	memset(&m_bi,0,sizeof(m_bi));
	m_bi.hwndOwner =m_hWnd;
	m_bi.pszDisplayName = m_szFolderDisplayName;
	m_bi.lpszTitle = _T("Title");
	m_bi.ulFlags = BIF_BROWSEINCLUDEFILES   ;
	
	m_pidlSelected = ::SHBrowseForFolder(&m_bi);
	
	if(m_pidlSelected != NULL)
	{
		::SHGetPathFromIDList(m_pidlSelected,m_szFolderPath);
	}
	m_edt = m_szFolderPath;
	UpdateData(FALSE);
}
:
MFC/Microsoft Foundation Class 2011. 2. 10. 15:27

사용자가 Shell폴더를 선택할 수 있는 다이얼로그 박스를 보여준다.

WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(
    LPBROWSEINFO lpbi
); 


- 네임스페이스의 루트의 상대적으로 선택한 폴더의 위치를 지정하고 아이템 식별자 목록을 반환한다.
- 사용자가 대화상자에서 취소 단추를 선택한 경우 반환 값은 NULL이다.

lpbi  : 다이얼로그를 표시하는 데 사용 정보가 들어있는 BROWSEINFO의 주소
:
MFC/Microsoft Foundation Class 2011. 2. 10. 14:12

MFC에서는 FolderBrowserDialog가 지원되지 않아서 직접 만들어야 한다.

[BROWSEINFO 구조체]

typedef struct _browseinfo { 
    HWND hwndOwner; 
    LPCITEMIDLIST pidlRoot; 
    LPSTR pszDisplayName; 
    LPCSTR lpszTitle; 
    UINT ulFlags; 
    BFFCALLBACK lpfn; 
    LPARAM lParam; 
    int iImage; 
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO; 

hwndOwner  : 다이얼로그 박스의 부모 윈도우의 핸들

pidlRoot브라우저에서부터 루트 폴더 위치 지정하는 ITEMIDLIST 구조 주소 찾아볼 수 있습니다.
오직 지정된 폴더 하위 폴더 대화 상자에 나타납니다.
이 멤버는 NULL이 될 수 있습니다. 이 경우, 네임 스페이스 루트 (바탕 화면 폴더) 사용됩니다

pszDisplayName : 버퍼 주소 사용자가 선택한 폴더 표시 이름을 보여줍니다.
버퍼 크기 MAX_PATH 바이트 간주됩니다.

lpszTitle : 다이얼로그의 트리뷰 컨트롤에서 Null종료 문자열의 주소를 보여줍니다
이 문자열은 사용자에게 일일이 가르쳐주는데 사용할 수 있습니다.

ulFlags : 대화 상자에 대한 옵션 지정하는 플래그.
  멤버 제로값이거나  다음 의 조합 포함할 수 있습니다

BIF_BROWSEFORCOMPUTER 컴퓨터만 리턴합니다. 다른것을 선택하면 OK버튼이 비활성화
BIF_BROWSEFORPRINTER 프린터만 리턴합니다. 다른것을 선택하면 OK버튼이 비활성화
BIF_BROWSEINCLUDEFILES 이browse dialog는 폴더 뿐만이 아니라 파일도 보여줍니다
BIF_DONTGOBELOWDOMAIN 트리 컨트롤 뷰에서 도메인 레벨 아래의 네트워크 폴더를 포함하지 않습니다
BIF_EDITBOX Version 4.71. The browse dialog includes an edit control in which the user can type the name of an item.
BIF_RETURNFSANCESTORS Only return file system ancestors. If the user selects anything other than a file system ancestor, the OK button is grayed.
BIF_RETURNONLYFSDIRS 시스템 디렉토리만 리턴합니다. 다른것을 선택하면 OK버튼이 비활성화
BIF_STATUSTEXT Include a status area in the dialog box. The callback function can set the status text by sending messages to the dialog box.
BIF_VALIDATE Version 4.71. If the user types an invalid name into the edit box, the browse dialog will call the application's BrowseCallbackProc with the BFFM_VALIDATEFAILED message. This flag is ignored if BIF_EDITBOX is not specified.
 lpfn : 응용프로램 정의 함수의 주소는 대화상자 이벤트가 발생할 때 호출합니다 자세한 내용은 BrowseCallbackProc기능을 참조하십시오. 이 멤버는 NULL이 될 수 있습니다.

lParam : 하나를 지정하면 응용프로갬 정의 값이 대화상자의 콜백함수로 전달합니다.
iImage : 변수에 선택한 폴더에 관련된 이미지를 받을 수 있습니다.
이미지가 시스템 이미지 목록 인덱스로 지정됩니다.
:
MFC/Microsoft Foundation Class 2011. 2. 8. 13:41

에러 변수

에러코드

설 명

WSAEINTR

10004

Blocking 윈속이 WSACancelBolcklocd에 함수취소 되었음

WSAEBADF

10009

잘못된 기술자(소켓핸들)

WSAEACCES

10013

브로드캐스트 어드레스를 위한 데이터그램 소켓의 접속시도가 setsockopt함수로 SO_BROADCAST가 설정되지 않은 상태에서 실패했음

WSAEFAULT

10014

Name 또는 namelen 매개변수가 올바른 형태가 아님

WSAEINVAL

10022

Accept 하기 전에 listen 함수가 불러지지 않았음

WSAEMFILE

10024

새로운 소켓에 할당하기 위한 소켓 기술자가 더 이상 남아있지 않음

WSAEWOULDBLOCK

10035

소켓 함수가 비블럭킹 모드로 동장죽

WSAEINPROGRESS

10036

블록화 함수가 호출되는 동안 부적절한 소켓 함수가 호출됨

WSAEALREADY

10037

이미 완료된 비동기 명형에 대한 취소가 시도됨

WSAENOTSOCK

10038

지정한 기술자가 소켓 기술자가 아님

WSAEDESTADDRREQ

10039

해당 함수에 목적지 어드레스가 필요하지만 제공되지 않았음

WSAEMSGSIZE

10040

수신된 메시지가 지정된 버퍼에 저장하기에 너무 커서 손실 되었음

WSAEPROTOTYPE

10041

지정된 프로토콜이 잘못 되었거나 이 소켓에 대해서 잘못된 형식

WSAENOPROTOOPT

10042

알 수 없는 옵션이거나, 지원되지 않는 옵션을 사용함

WSAEPROTONOSUPPORT

10043

지정된 프로토콜이 지원되지 않는 형식

WSAESOCKTNOSUPPORT

10044

지정된 소켓 타입이 지정한 어드레스 체계에서 지원되지 않는 형식

WSAEOPNOTSUPP

10045

Socket이 연결지향형 서비스(SOCK_STREAM)형태가 아님

<:listenUDP socket호출<

WSAEPFNOSUPPORT

10046

지정된 프로토콜 체계가(PF_*)지원되지 않음

WSAEAFNOSUPPORT

10047

지정된 어드레스 체계가(AF_*)지원되지 않음

WSAEADDRINUSE

10048

지정한 어드레스(IP)가 이미 사용중

WSAEADDRNOTAVAIL

10049

지정된 어드레스는 로컬 머신에서 사용할 수 없음

WSAENETDOWN

10050

네트웍 서브 시스템에 에러가 발생

WSAENETUNREACH

10051

원격 시스템까지 네트웍이 도달할 수 없음

WSAENETRESET

10052

연산이 진행되고 있는 도중 접속이 끊겨버림

WSAECONNABORTED

10053

연결이 out-of-band나 다른 실패 떄문에 끊어져 버렸음

WSAECONNRESET

10054

원격 연결지에서 “hard”“abortive” 종료를 수행해서 리셋되었음

WSAENOBUFS

10055

윈도우 소켓 시스템의 버퍼 공간이 모자라거나, 애플리케이션에 의해 API에게 제돈되 공간이 너무 작아서 요청된 정보를 저장할 수 없음

WSAEISCONN

10056

지정된 소켓이 이미 연결되어 있음

WSAENOTCONN

10057

지정된 소켓이 이미 연결되어 있지 않음

WSAESHUTDOWN

10058

소켓이 셧다운(shutdown()) 되었음

WSAETOOMANYREFS

10059

지정한 함수에 대한 인자가 너무 많음

WSAETIMEOUT

10060

접속 시도가 시간초과 되었음

WSAECONNREFUSED

10061

접속 시도가 강제로 종료되었음

WSAELOOP

10062

 

WSAENAMETOOLONG

10063

 

WSAEHOSTDOWN

10064

원격 호스트가 다운 되었음

WSAEHOSTUNREACH

10065

네트워크 시스템 장애 들에 의해서 원격호스트까지 도달 할 수 없음

WSASYSNOREADY

10091

네트워크 서브 시스템이 아직 통신할 준비가 되어 있지 않음(WSAStartup()이 반환)

WSAVERNOTSUPPORTED

10092

요청한 윈도우 소켓 버전이 현재 윈도우 시스템에서 지원하지 않음

WSANOTINITIALISED

10093

이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었음

WSAHOST_NOT_FOUND

11001

호스트를 찾아낼 수 없음

WSATRY_AGAIN

11002

요청된 정보가 발견되지 않음

WSANO_RECOVERY

11003

회복할 수 없는 에러 발생

WSANO_DATA

11004

잘못된 이름으로 아무런 데이터가 기록되지 않았음


:
MFC/Microsoft Foundation Class 2011. 2. 7. 10:52
:
MFC/Microsoft Foundation Class 2011. 2. 7. 09:22

void SendString()
{
CString msg= "msg";
SendMessage(m_hWnd,WM_MYMESSAGE,(WPARAM)&msg,0);
}

void RevMessage(WPARAM w,LPARAM l)
{
CString* temp = (CString*)w;
CString msg;
msg.Format("%s",*temp);
......
}
쉽게말해서 주소값을 보내서 포인터로 받은 후 계속 포인터로 사용하는기 보다는
다른 CString을 선언해서 일반 CString으로 사용
:
MFC/Microsoft Foundation Class 2011. 1. 24. 10:47

void CALLBACK 함수명(HWND hWnd, UINT nID, UINT nEl, DWORD time)
{
//구현부분	
}

Callback 함수의 원형으로 해당 형태의 함수명를 Settime의 3번째 인자로 넣어주면
지정한 시간마다 해당 함수가 호출된다
void CALLBACK time2(HWND hWnd, UINT nID, UINT nEl, DWORD time)
{
	CWnd* m_pWnd = AfxGetMainWnd();
	CTimer_CheckDlg* m_pParent = (CTimer_CheckDlg*)m_pWnd;
	m_pParent->m_pro1.StepIt();
	m_pParent->m_pro2.StepIt();
	m_pParent->m_pro3.StepIt();
}
void CALLBACK time1(HWND hWnd, UINT nID, UINT nEl, DWORD time)
{
	CWnd* m_pWnd = AfxGetMainWnd();
	CTimer_CheckDlg* m_pParent = (CTimer_CheckDlg*)m_pWnd;
	CString time_edit;
	time_edit.Format("1번 TIME COUNT : %d",m_pParent->cnt++);
	m_pParent->m_edt = time_edit;
	m_pParent->UpdateData(FALSE);
}
BOOL CTimer_CheckDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	cnt = 0;
	SetTimer(1,1000,time1);
	SetTimer(2,1000,time2);

	m_pro1.SetRange(0,1000);
	m_pro2.SetRange(0,2000);
	m_pro3.SetRange(0,3000);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}
: