검색결과 리스트
IT/Programming/WinAPI에 해당되는 글 7건
- 2014.04.21 (WinAPI) 디렉터리 제어 응용
- 2013.10.17 (WinAPI/MFC) GUI 프로그래밍을 하면서 콘솔을 임의로 띄워 테스트하기
- 2013.10.16 (WinAPI) editbox 에 줄바꿈 삽입이 안될 때
- 2013.09.06 TreeView CommonController 사용시 주의할 점
- 2013.07.10 (WinAPI) 파일/폴더 경로 조작과 관련된 유용한 함수 리스트
- 2013.07.08 (WinAPI) 문자열 함수(멀티바이트->유니코드->TCHAR)
- 2013.07.08 TCHAR 문자열을 printf() 할 때 발생하는 문제점의 원인
글
(WinAPI) 디렉터리 제어 응용
출처 : http://blog.daum.net/studiocoma/6521408
Win32 API가 제공하는 CreateDirectory 함수의 응용.
API CreateDirectory의 경우 c:\1\2\3을 만들때 c:\1\2가 이미 존재하지 않으면 실패한다. -_-
이를 보완하고(상위폴더부터 주구장창 만들어 낸다;) 경로에 파일명까지 포함되어 있어도 폴더만 만들도록 해봤다.
- 말은 거창(?)한데 그냥 문자열 파싱해서 CreateDirectory를 반복 호출한다;;
BOOL _CreateDirectory( LPCTSTR lpszPath )
{
TCHAR szPathBuffer[MAX_PATH];
size_t len = _tcslen( lpszPath );
for ( size_t i = 0 ; i < len ; i++ )
{
szPathBuffer[i] = *( lpszPath + i );
if ( szPathBuffer[i] == _T('\\') || szPathBuffer[i] == _T('/') )
{
szPathBuffer[i + 1] = NULL;
if ( ! PathFileExists( szPathBuffer ) )
{
if ( ! ::CreateDirectory( szPathBuffer, NULL ) )
{
if ( GetLastError() != ERROR_ALREADY_EXISTS )
return FALSE;
}
}
}
}
return TRUE;
}
-----------------------------------------------------------------------------------------
CFileFind fileFinder;
if(!fileFinder.FindFile(".\\simple\\MyMenu.mdb"))
{
CreateDirectory(".\\simple", NULL);
CopyFile(".\\MyMenu.mdb", ".\\simple\\MyMenu.mdb", TRUE);
}
부모디렉토리없어도 디렉토리 생성하기, 디렉토리에 파일있어도 하위디렉토리까지 모든파일 삭제하기
출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=7293&ref=7293
#include <windows.h>
#include <stdio.h>
#include <string>
using namespace std;
/*
기존 디렉토리가 있을경우 안만들어지고 없으면 만든다. 부모디렉토리가 없어도 생성가능
*/
void CreateDir(char* Path)
{
char DirName[256]; //생성할 디렉초리 이름
char* p = Path; //인자로 받은 디렉토리
char* q = DirName;
while(*p)
{
if (('\\' == *p) || ('/' == *p)) //루트디렉토리 혹은 Sub디렉토리
{
if (':' != *(p-1))
{
CreateDirectory(DirName, NULL);
}
}
*q++ = *p++;
*q = '\0';
}
CreateDirectory(DirName, NULL);
}
/*
하위디렉토리를 제외한 해당 디렉토리 모든 파일들을 제거
*/
void DeleteAllFiles(char* folderPath)
{
char fileFound[256];
WIN32_FIND_DATA info;
HANDLE hp;
sprintf(fileFound, "%s\\*.*", folderPath);
hp = FindFirstFile(fileFound, &info); //디렉토리에 파일이 있는지 첫번째 파일만.
do
{
sprintf(fileFound,"%s\\%s", folderPath, info.cFileName);
DeleteFile(fileFound);
}while(FindNextFile(hp, &info)); //다른 파일이 있을때 까지
FindClose(hp);
}
/*
해당 하는 디렉토리에 파일이 존재해도 디렉토리가 비어있지 않아도 지울수 있다 .
*/
void EmptyDirectory(char* folderPath)
{
char fileFound[256];
WIN32_FIND_DATA info;
HANDLE hp;
sprintf(fileFound, "%s\\*.*", folderPath);
hp = FindFirstFile(fileFound, &info); //디렉토리에 파일이 있는지 첫번째 파일만.
do
{
if (!((strcmp(info.cFileName, ".")==0)||(strcmp(info.cFileName, "..")==0)))
{
if((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)==FILE_ATTRIBUTE_DIRECTORY) //Sub디렉토리가 존재하는경우
{
string subFolder = folderPath;
subFolder.append("\\");
subFolder.append(info.cFileName);
EmptyDirectory((char*)subFolder.c_str()); /// {return (_Ptr == 0 ? _Nullstr() : _Ptr); }
RemoveDirectory(subFolder.c_str());
}
else
{
sprintf(fileFound,"%s\\%s", folderPath, info.cFileName);
BOOL retVal = DeleteFile(fileFound);
}
}
}while(FindNextFile(hp, &info));
FindClose(hp);
}
-----------------------------------------------------------------------------------------
CreateDirectory 에서 폴더 접근 권한 바꾸기
출처 : http://ktr0.egloos.com/757379
Windows API 를 보면 CreateDirectory 라는 함수가 있다.
CreateDirectory("c:\aaa",NULL);
위와 같은 방법으로 첫번째 파라메터에 폴더 이름을 써 주고
두번째 파라메터에 NULL 을 써 주는 경우가 많다.
두 번째 파라메터는 사실 보안에 대한 파라메터이다.
PSECURITY_ATTRIBUTE 형의 변수가 들어가는데, NULL 이면 부모 폴더의
값을 그대로 가져온다.
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
PSID pEveryoneSID = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
EXPLICIT_ACCESS ea[2];
PACL pacl = NULL;
if(!AllocateAndInitializeSid(&SIDAuthWorld,1, SECURITY_WORLD_RID,0,0,0,0,0,0,0,&pEveryoneSID))
{
AfxMessageBox("Fail to get Everyone SID!!!",0,0);
return;
}
ZeroMemory(&ea, 2*sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = GENERIC_ALL;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;
SetEntriesInAcl(1,ea, NULL, &pacl);
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE,pacl , FALSE);
//SetSecurityDescriptorSacl(&sd, TRUE,pacl , FALSE);
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = &sd;
sa.bInheritHandle = TRUE;
::CreateDirectory(sysDirBuffer_tmp,&sa);
if(pEveryoneSID){
FreeSid(pEveryoneSID);
}
if(pacl){
LocalFree(pacl);
}
위의 예가 바로 CreateDirectory 함수에서 SECURITY_ATTRIBUTE 값을 가지고
폴더에 모든 ACCESS 권한을 주는 예제이다.
http://www.tipssoft.com/bulletin/board.php?bo_table=QnA&wr_id=380&page=392
GetCurrentDirectory 함수 : 현재의 작업 디렉토리를 얻어온다.
SetCurrentDirectory 함수 : 작업디렉토리의 경로를 셋팅한다.
일반적으로 작업디렉토리는 파일이 실행된 경로가 지정됩니다.
아래는 작업디렉토리의 변경이 일어나는 대표적인 예인 CFileDialog 대화상자를 이용한 경우입니다
참고하시면 될 듯 싶습니다.
char path[MAX_PATH] = {0};
// 현재의 작업디렉토리를 저장한다.
GetCurrentDirectory(MAX_PATH, path);
// CFileDialog 를 Open 모드로 생성한다.
CFileDialog dlg(TRUE);
if(dlg.DoModal()==IDOK){
// 사용자가 폴더를 옮겨가며 특정 파일을 지정
// 이경우 작업폴더가 변경됨.
CString str = dlg.GetFileName();
//얻어온 파일과 관련된 코드 추가..............
// 이전에 저장했던 작업디렉토리 경로를 되돌려 셋팅
SetCurrentDirectory(path);
}
=============================================
Directory 컨트롤에 관하여 좋은 응용 예제를 모아놓은 블로그(http://blog.naver.com/dolicom/10096040743)에서 관련된 내용을 퍼왔다.
위의 응용 예제도 나쁘지 않지만, CreateDirectory 를 사용하여 디렉터리 트리를 구성할 때에는 CreateDirectory() 보다는 SHCreateDirectory / SHCreateDirectoryEx() 를 사용하는 것이 훨씬 편하다.
SHCreateDirectoryEx(NULL, "C:\\a\\b\\", NULL);
이런식으로만 하면 a 폴더가 없더라도 a\b 폴더 둘 다 만들어지기 때문이다. 해당 함수를 쓰기 위해서는 Shlobj.h 를 포함시켜야 한다.
SHCreateDirectoryEx : http://msdn.microsoft.com/en-us/library/windows/desktop/bb762131(v=vs.85).aspx
SHSHFileOperation function : http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164(v=vs.85).aspx
'IT/Programming > WinAPI' 카테고리의 다른 글
(WinAPI/MFC) GUI 프로그래밍을 하면서 콘솔을 임의로 띄워 테스트하기 (0) | 2013.10.17 |
---|---|
(WinAPI) editbox 에 줄바꿈 삽입이 안될 때 (0) | 2013.10.16 |
TreeView CommonController 사용시 주의할 점 (0) | 2013.09.06 |
(WinAPI) 파일/폴더 경로 조작과 관련된 유용한 함수 리스트 (0) | 2013.07.10 |
(WinAPI) 문자열 함수(멀티바이트->유니코드->TCHAR) (0) | 2013.07.08 |
글
(WinAPI/MFC) GUI 프로그래밍을 하면서 콘솔을 임의로 띄워 테스트하기
콘솔 환경에서는 값을 찍어보며 확인하기 위해서 printf() 를 주로 사용하게 된다. 하지만 GUI 프로그래밍의 경우에는 콘솔이 존재하지 않아 printf() 로 값을 확인할 수 없기 때문에 Output 창을 사용하거나 MessageBox 등을 이용하는 경우가 많은데, 아래의 코드처럼 별도로 subsystem을 console로 지정해주면 GUI창과 콘솔 창 모두 확인할 수 있다.
#ifdef _DEBUG // 디버그 모드일 경우
#ifdef UNICODE // 유니코드일 경우
#pragma comment(linker, "/entry:wWinMainCRTStartup /subsystem:console")
#else // 멀티바이트일 경우
#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")
#endif
#endif
'IT/Programming > WinAPI' 카테고리의 다른 글
(WinAPI) 디렉터리 제어 응용 (0) | 2014.04.21 |
---|---|
(WinAPI) editbox 에 줄바꿈 삽입이 안될 때 (0) | 2013.10.16 |
TreeView CommonController 사용시 주의할 점 (0) | 2013.09.06 |
(WinAPI) 파일/폴더 경로 조작과 관련된 유용한 함수 리스트 (0) | 2013.07.10 |
(WinAPI) 문자열 함수(멀티바이트->유니코드->TCHAR) (0) | 2013.07.08 |
글
(WinAPI) editbox 에 줄바꿈 삽입이 안될 때
editbox 컨트롤에 줄바꿈(엔터키, 개행문자)을 넣을 때 "\r\n" 을 삽입해도 강제개행이 되지 않는 경우가 있다.
예를 들어 다음과 같은 코드를 삽입했을 때 우리는 editbox 컨트롤에 다음과 같이 개행이 되어 있는 상태로 글이 삽입되기를 기대하게 된다.
SetWindowText(hEdit, TEXT("AAAA\r\nBBBB\r\n");
AAAA
BBBB
하지만 이렇게 되지 않고 AAAABBBB 와 같이 개행문자가 무시되는 경우가 있는데, 이 경우 해당 에디트 박스의 스타일 중 Multiline 스타일을 True로 설정이 되어 있는지를 확인해야한다. 이 스타일이 적용되어 있지 않다면 개행이 되지 않는다.
'IT/Programming > WinAPI' 카테고리의 다른 글
(WinAPI) 디렉터리 제어 응용 (0) | 2014.04.21 |
---|---|
(WinAPI/MFC) GUI 프로그래밍을 하면서 콘솔을 임의로 띄워 테스트하기 (0) | 2013.10.17 |
TreeView CommonController 사용시 주의할 점 (0) | 2013.09.06 |
(WinAPI) 파일/폴더 경로 조작과 관련된 유용한 함수 리스트 (0) | 2013.07.10 |
(WinAPI) 문자열 함수(멀티바이트->유니코드->TCHAR) (0) | 2013.07.08 |
글
TreeView CommonController 사용시 주의할 점
1. TreeView_DeleteItem() 을 사용시, TreeView_DeleteItem(hTree, NULL); 처럼 HTREEITEM 인자에 NULL 값을 주면 전체 노드가 삭제된다. 이게 왜 주의할 점이냐면, TreeView_DeleteItem(hTree,TreeView_GetChild(hTree, Node)); 처럼 사용할 경우, Node의 자식 노드가 존재하지 않을 경우 TreeView_GetChild() 가 NULL을 리턴한다. 즉, 의도하지 않게 전체 노드가 삭제될 수 있다는 이야기다.
삭제를 위한 반복문에서 이 경우를 신경쓰지 않고 코딩을 하면 이런 버그를 만날 수 있다.
물론 이를 방지하기 위해서는 다음과 같이 자식 노드가 존재하는지를 미리 체크해주는 루틴을 넣어주면 된다.
if( NULL != TreeView_GetChild(hTree, Node)) {
TreeView_DeleteItem(hTree, TreeView_GetChild(hTree,Node));
}
2. TreeView_GetItem() 을 사용하여 노드의 텍스트를 가져올 때, cchTextMax도 설정해주어야 한다.
ex)
TVITEM tvi;
char buf[25];
tvi.hItem = Node;
tvi.mask = TVIF_TEXT;
tvi.cchTextmax = 20;
tvi.pszText = buf;
TreeView_GetItem(hTree, &tvi);
3. 어지간하면 TreeView_Expand() 는 맨 마지막에.
TreeView에 데이터를 넣다 보면 여기 저기 갖가지 부모 노드에 자식 노드를 넣어야 하는 경우가 있다. 이럴 경우 노드 처리 작업을 모두 진행한 후에 TreeView_Expand() 를 해줘야지 해당 노드가 제대로 펼쳐진다. 즉, 미리 TreeView_Expand() 명령을 때려놓고 노드 삽입/삭제 작업을 진행하면 Expand가 풀려버리게 된다는 말이다.
'IT/Programming > WinAPI' 카테고리의 다른 글
(WinAPI/MFC) GUI 프로그래밍을 하면서 콘솔을 임의로 띄워 테스트하기 (0) | 2013.10.17 |
---|---|
(WinAPI) editbox 에 줄바꿈 삽입이 안될 때 (0) | 2013.10.16 |
(WinAPI) 파일/폴더 경로 조작과 관련된 유용한 함수 리스트 (0) | 2013.07.10 |
(WinAPI) 문자열 함수(멀티바이트->유니코드->TCHAR) (0) | 2013.07.08 |
TCHAR 문자열을 printf() 할 때 발생하는 문제점의 원인 (0) | 2013.07.08 |
글
(WinAPI) 파일/폴더 경로 조작과 관련된 유용한 함수 리스트
사용하기 위해 아래와 같이 선언한다.
#include <shlwapi.h> #pragma comment(lib, "shlwapi")
해당 API에 MSDN 링크가 붙어있으니 클릭하면 더 자세한 정보를 얻을 수 있다.
PathAddBackslash - 경로에 백슬레시를 덧붙여준다. 백슬레시가 이미 붙어 있으면 변경하지 않는다.
"c:\abc\" -> "c:\abc\"
"c:\abc.cpp", ".tmp" -> "c:\abc.cpp"
"c:\abc\", "def" -> "c:\abc\def"
"c:\abc", "\def" -> "c:\abc\def"
"c:\abc\", "\def" -> "c:\abc\def"
1 -> "B:\"
2 -> "C:\"
"c:\abc\def\.\ghi" -> "c:\abc\def\ghi"
"c:\abc\", "..\def\ghi.txt" -> "c:\def\ghi.txt"
"c:\abc\def\jkl.txt", "c:\abc\def\..\jkl.txt" -> "c:\abc\def"
"abc\def.txt" -> "def.txt"
"def.txt" -> ""
"iexplore.exe", { "c:\Windows", "c:\Program Files", "c:\Program Files\Internet Explorer", NULL } -> "c:\Program Files\Internet Explorer\iexplore.exe"
파일이 여러개라면 첫번째로 발견된 파일의 경로만 반환
"c:\abc\def\ghi.txt", { "def.txt", "DEF.txt", ".txt" }, 3 -> ".txt"
"test.exe sample All 15" -> "sample All 15"
"test.exe" -> ""
"abc def ghi" -> "def ghi"
'.' -> GCT_LFNCHAR | GCT_SHORTCHAR
'\\' -> GCT_SEPARATOR
'/' -> GCT_INVALID
'\"' -> GCT_INVALID
'\'' -> GCT_LFNCHAR | GCT_SHORTCHAR
'\t' -> GCT_INVALID
'\n' -> GCT_INVALID
',' -> GCT_LFNCHAR
'*' -> GCT_WILD
'?' -> GCT_WILD
입력된 문자열을 검색하면서 리턴값을 조사하면 올바른 경로인지 미리 검사할 수 있다.
"d:" -> 3
"s:\test" -> 18
".txt", "text/plain" -> TRUE
"txt", "text/plain" -> FALSE
"c:\abc" -> FALSE
"test.txt" -> TRUE
"*-wow." -> TRUE
"test.htm" -> TRUE
"test.xml" -> FALSE
"test.txt" -> FALSE
PathIsLFNFileSpec - 주어진 경로가 긴파일이름에 적합한지 확인한다.
PathIsNetworkPath - 주어진 경로가 네트워크 경로 형식인지 확인한다. (실제로 존재하는지 확인하지는 않음)
"\\abc\def.txt" -> TRUE
"http://abc/def.txt" -> FALSE
"C:\", "c:\abc" -> TRUE
"c:", "c:\abc" -> FALSE
"..\abc", "..\abc\def" -> TRUE
"d:\abc", "d:\def" -> FALSE
"..\abc\def.txt" -> TRUE
"c:\abc\def.txt" -> FALSE
"c:\abc\..\def.txt" -> FALSE
"test.txt" -> TRUE
"c:" -> FALSE
"c:\test.txt" -> FALSE
"c:\program files" -> TRUE
"C:\Documents and Settings" -> FALSE
"C:\Documents and Settings\All Users\Application Data" -> TRUE
PathIsUNC - 네트워크 공유 경로인지 확인한다. (실제로 존재하는지 확인하지는 않음)
"\\abc\def" -> TRUE
"\\192.168.0.1" -> TRUE
"\\abc\def.txt" -> TRUE
"\\" -> TRUE
"\\test.txt" -> TRUE
PathIsUNCServer - 네트워크 공유 서버인지 확인한다. (실제로 존재하는지 확인하지는 않음)
"\\abc\def" -> FALSE
"\\192.168.0.1" -> TRUE
"\\abc\def.txt" -> FALSE
"\\" -> TRUE
"\\test.txt" -> TRUE
PathIsUNCServerShare - 네트워크 공유 폴더인지 확인한다. (실제로 존재하는지 확인하지는 않음)
"\\abc\def" -> TRUE
"\\192.168.0.1" -> FALSE
"\\abc\def.txt" -> TRUE
"\\" -> FALSE
"\\test.txt" -> FALSE
PathIsURL - 주어진 경로가 URL 형식이 맞는지 확인한다.
PathMakePretty - 대문자로 만들어진 경로 문자열을 소문자로 변환한다. (소문자가 하나라도 있으면 실패)
"c:\ABC\DEF" -> FALSE, "c:\ABC\DEF"
"C:\abc\DEF" -> FALSE, "C:\abc\DEF"
"abc.txt", "ab?.*" -> TRUE
"c:\abc\def.txt", "*\???.txt" -> TRUE
c:\abc -> c:\abc
"c:\abc\def\ghi\jkl", FILE_ATTRIBUTE_DIRECTORY, "c:\abc\mno\pqr.txt", 0
"test.exe sample All 15" -> "test.exe"
"test.exe" -> "test.exe"
"abc def ghi" -> "abc"
"c:\abc" -> "c:\abc"
"c:\abc\def\" -> "c:\abc\def"
"c:\abc\def", ".bak" -> "c:\abc\def.bak"
"c:\abc\def\", ".bak" -> "c:\abc\def\.bak"
"C:\foo\baz\.." -> "C:\foo"
"C:\foo\\\baz" -> "C:\foo\baz"
"\\server\aa\..\bb" -> "\\server\aa\bb"
"notepad.exe" -> "C:\Windows\System32\notepad.exe"
"%SystemRoot%\System32\notepad.exe" -> "C:\Windows\System32\notepad.exe"
(XP에서는 환경변수 확장이 제대로 작동하지 않음)
PathSetDlgItemPath - 주어진 다이얼로그 아이템 윈도우의 크기에 알맞게 긴 경로를 적당히 줄여준다.
PathSkipRoot - 루트 경로를 제외한 첫번째 위치를 찾아서 반환한다.
"\\\\abc\\def\\ghi.txt" -> "ghi.txt"
"c:\abc\def" -> "def"
"c:\abc\def\" -> "def\"
"c:\abc\def" -> "c:\"
"C:\Path\File[12]" -> "C:\Path\File"
"C:\Path\File.txt" -> "C:\Path\File.txt"
"C:\Path\[3].txt" -> "C:\Path\[3].txt"
인터넷으로 접근한 임시파일들은 [#]과 같은 식으로 번호가 뒤에 붙는데 그러한 임시 번호를 제거한다.
"c:\program files\test.txt" -> "%ProgramFiles%\test.txt"
"c:\abc\def" -> "%SystemDrive%\abc\def"
'IT/Programming > WinAPI' 카테고리의 다른 글
(WinAPI/MFC) GUI 프로그래밍을 하면서 콘솔을 임의로 띄워 테스트하기 (0) | 2013.10.17 |
---|---|
(WinAPI) editbox 에 줄바꿈 삽입이 안될 때 (0) | 2013.10.16 |
TreeView CommonController 사용시 주의할 점 (0) | 2013.09.06 |
(WinAPI) 문자열 함수(멀티바이트->유니코드->TCHAR) (0) | 2013.07.08 |
TCHAR 문자열을 printf() 할 때 발생하는 문제점의 원인 (0) | 2013.07.08 |
글
(WinAPI) 문자열 함수(멀티바이트->유니코드->TCHAR)
strcpy -> wcscpy -> _tcscpy (문자열을 복사)
strncpy -> wcsncpy -> _tcsncpy ( 사이즈 만큼 복사)
strlen -> wcslen -> _tcslen (문자열 길이 확인)
strcat -> wcscat -> _tcscat (두 문자열 이어 붙이기)
strncat -> wcsncat -> _tcsncat (사이즈 만큼 이어 붙이기)
strcmp -> wcscmp -> _tcscmp (문자열 비교) (반환 값(-1, 0, 1))
strncmp -> wcsncmp? -> _tcsncmp ( 사이즈 만큼 문자열 비교)
stricmp -> wcsicmp -> _tcsicmp (대소문자를 구별하지 않고 문자열을 비교)
strnicmp -> wcsnicmp -> _tcsnicmp (사이즈 만큼 대소문자를 구별하지 않고 문자열을 비교)
strchr -> wcschr -> _tcschr (문자 찾기)
strrchr -> wcsrchr -> _tcsrchr (문자 찾기 (문자열 끝에서 부터 검색))
strstr -> wcsstr -> _tcsstr (문자열 찾기)
strpbrk -> wcspbrk -> _tcspbrk (문자 찾기 (두번째 인수를 찾고자 하는 문자들의 집합(문자열)으로 구성)
strtok -> wcstok -> _tcstok (문자열 자르기 (두번째 인수를 집합(문자열)으로 구성 가능)) => 해당 문자가 NULL로 치환 됨
strset -> wcsset -> _tcsset (문자 치환, 첫째 인수의 모든 문자를 두번째 인수 문자로 변경함) => "abc" -> "bbb"
strnset -> wcsnset -> _tscnset (사이즈 만큼 문자 치환)
strupr -> wcsupr -> _tcsupr (대문자로 치환)
strlwr -> wcslwr -> _tcslwr (소문자로 치환)
strrev -> wcsrev -> _tcsrev (문자열 역정렬) => "가나다라마" -> "마라다나가"
'IT/Programming > WinAPI' 카테고리의 다른 글
(WinAPI/MFC) GUI 프로그래밍을 하면서 콘솔을 임의로 띄워 테스트하기 (0) | 2013.10.17 |
---|---|
(WinAPI) editbox 에 줄바꿈 삽입이 안될 때 (0) | 2013.10.16 |
TreeView CommonController 사용시 주의할 점 (0) | 2013.09.06 |
(WinAPI) 파일/폴더 경로 조작과 관련된 유용한 함수 리스트 (0) | 2013.07.10 |
TCHAR 문자열을 printf() 할 때 발생하는 문제점의 원인 (0) | 2013.07.08 |
글
TCHAR 문자열을 printf() 할 때 발생하는 문제점의 원인
되게 간단한건데, 왜 이리 자주 까먹는지 모르겠다.. -_-;
윈도우 프로그래밍에 익숙해지지 않아서인것 같다.
UNICODE 문자열 abc가 저장된다고 가정하면 아래와 같이 저장이 된다.
'a'\0 'b'\0 'c'\0 ... (나의 조악한 표현에 묵념을..)
한 바이트마다 NULL 문자가 붙는 것이 특징인데,
printf()가 UNICODE를 지원하지 않아서 당연히 문자 하나밖에 출력이 되지 않는다.
'IT/Programming > WinAPI' 카테고리의 다른 글
(WinAPI/MFC) GUI 프로그래밍을 하면서 콘솔을 임의로 띄워 테스트하기 (0) | 2013.10.17 |
---|---|
(WinAPI) editbox 에 줄바꿈 삽입이 안될 때 (0) | 2013.10.16 |
TreeView CommonController 사용시 주의할 점 (0) | 2013.09.06 |
(WinAPI) 파일/폴더 경로 조작과 관련된 유용한 함수 리스트 (0) | 2013.07.10 |
(WinAPI) 문자열 함수(멀티바이트->유니코드->TCHAR) (0) | 2013.07.08 |