오늘은 작업관리자에서 강제로 프로세스를 종료하는 방법이 있는데 이런 방법을 프로그램을 하는 것에 대해 설명하고자 합니다.


보통 메인 프로그램이 서브프로그램을 강제로 종료시킬 때 sendmessage 을 통해서 종료를 시키게 되는데 해당 프로그램이 lock이 걸렸거나 이벤트를 받지를 못하는 상황이 생겼을 때 위 메세지는 의미가 없게 된다.


그렇기에 강제로 프로세스를 종료를 시켜야 하는데 이에 사용한 함수를 소개 하고자 합니다.


** 소스코드


// CString strProcessName : 프로세스 파일명.확장자

BOOL Util::ProcessKill(CString strProcessName)

{

HANDLE hProcessSnap = NULL;

BOOL bRet = FALSE; 

PROCESSENTRY32 pe32 = {0}; 


hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

if (hProcessSnap == (HANDLE)-1) 

return false;

pe32.dwSize = sizeof(PROCESSENTRY32); 


//프로세스가 메모리상에 있으면 첫번째 프로세스를 얻는다

if (Process32First(hProcessSnap, &pe32)) 

BOOL bCurrent = FALSE; 

MODULEENTRY32 me32 = {0}; 


do { 

bCurrent = GetProcessModule(pe32.th32ProcessID,strProcessName);

if(bCurrent) { 

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID); 

if(hProcess) {

if(TerminateProcess(hProcess, 0)) {

unsigned long nCode; //프로세스 종료 상태 

GetExitCodeProcess(hProcess, &nCode);

}

CloseHandle(hProcess); 

}

}

}

//다음 프로세스의 정보를 구하여 있으면 루프를 돈다.

while (Process32Next(hProcessSnap, &pe32)); 


CloseHandle (hProcessSnap); 

return true;

}



// 위 함수애서 호출되는 것으로 해당 프로세스아이디, 이름이 존재하는지 찾는다.'

// DWORD dwPID : 프로세스아이디

// CString sProcessName : 프로세스파일명.확장자

BOOL Util::GetProcessModule(DWORD dwPID, CString sProcessName)

{

HANDLE hModuleSnap = NULL;

MODULEENTRY32 me32 = {0};


hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID); 

if(hModuleSnap == (HANDLE)-1) 

return (FALSE); 

me32.dwSize = sizeof(MODULEENTRY32); 


//해당 프로세스의 모듈리스트를 루프로 돌려서 프로세스이름과 동일하면 

//true를 리턴한다.

if(Module32First(hModuleSnap, &me32)) { 

do { 

if(me32.szModule == sProcessName)

CloseHandle (hModuleSnap); 

return true;


while(Module32Next(hModuleSnap, &me32)); 


CloseHandle (hModuleSnap); 

return false;

}


* 사용법


BOOL ret = m_util.ProcessKill("aaa.exe");


작업관리자에서 보이는 파일명.확장을 인자로 넘기면 됩니다. 대소문자 구분도 하니 보이는 그대로 인자를 넘겨야 합니다.











오늘은 해당 프로그램이 실행중인지 확인하는 함수를 소개하고자 합니다.

보통 FindWindow 을 사용하면 되지만.. 부팅 시 자동실행이나 PC의 부하가 많은 상태에서는 FindWindow 로는 해당 window을 찾지 못하는 경우가 있습니다.

그래서 직접 작업관리자에서 해당 파일이 실행중인지 확인해서 해당 핸들을 얻는 방법이 가장 정확한 방법이기에 소개합니다.


보통 FindWindow 로 먼저 처리하고, 프로그램을 운영을 하면서 FindWindow 가 통과하는 경우가 발생하면 CreateToolhelp32Snapshot 울 이용을 하개 됩니다..




* 소스코드


// CString parm_exe : exe 파일명

// DWORD parm_id : 프로세스 아이디 (모르는 경우 -1 사용)

int Util::FindDoubleProcess(CString parm_exe, DWORD parm_id)

{

int ret_val = 0;

BOOL bGet = FALSE;

CString read_name;

CString parm_exe_lower = parm_exe;

HANDLE hSnapshot;

PROCESSENTRY32 ppe; //구성된 자료구조를 저장하기 위한 엔트리.



hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//system 프로세서(pid=0)의 상태를 읽어 온다

ppe.dwSize = sizeof(PROCESSENTRY32);    //엔트리 구조체 사이즈를 정해준다.

bGet = Process32First(hSnapshot, &ppe); //엔트리 중 자료를 가져온다.

parm_exe_lower.MakeLower();

while (bGet){

read_name = ppe.szExeFile;

read_name.MakeLower();

if( read_name == parm_exe && parm_id != ppe.th32ProcessID ){

int dd = ppe.th32ProcessID;

ret_val = 1; break;

}

bGet = Process32Next(hSnapshot, &ppe);

}


CloseHandle(hSnapshot);


return ret_val;

}


* 사용법

int ret = FindDoubleProcess("aaa.exe", -1);

위처럼 해당파일명이 존재하는지 찾게 됩니다. 
대소문자를 구분하게 되어서 호출 시 소문자로 전달해야 정확히 찾게 됩니다.

참 쉽죠~~










오늘은 윈도우 시스템의 바탕화면, quickLaunch, 시작메뉴  에 원하는 실행파일을 위한 단축아이콘 생성에 대한 통합 함수를 설명하고자 합니다.


아래 함수 하나면 원하는 위치에 생성할 수 있습니다. (win10 에서는 안해봐서 될지는 잘.. 해봐야 알 것 같네요..)


이 단축아이콘을 변경되는 경우는 PC을 재부팅해야 설정이 되더라구여..

원래는 아래 함수 후에 시스템에 notify 을 줘야 하는데 그 부분은 검색해 보시면 됩니다. 


* 소스코드


// LPTSTR pszFilePath : 실행파일경로  및 파일명.확장자

// LPTSTR pszTitle :  \\파일명.lnk

// LPTSTR pszDescription : 표시할 툴팁

// BOOL bDesktop : 바탕화면 생성 유무 TRUE., FALSE

// BOOL bQuickLanch : quicklaunch 생성 유무 TRUE., FALSE

// BOOL bStartMenu : 시작메뉴 생성 유무 TRUE., FALSE

// BOOL bOverWrite :  기존 구성 덮어쓰기 유무 TRUE., FALSE


BOOL Util::CreateShortcut( LPTSTR pszFilePath, LPTSTR pszTitle, LPTSTR pszDescription, BOOL bDesktop, BOOL bQuickLanch, BOOL bStartMenu, BOOL bOverWrite)

{

// D1 ("CShorCutDlg::CreateShortcut() : pszFilePath=%s", pszFilePath);

SHGETFOLDERPATH fnShGetFolderPath;


if( !bDesktop && !bQuickLanch && !bStartMenu )  return TRUE;


HMODULE hModule = LoadLibrary("SHFOLDER.DLL");

if (hModule != NULL){

fnShGetFolderPath = (SHGETFOLDERPATH)GetProcAddress(hModule, "SHGetFolderPathA");


if (fnShGetFolderPath == NULL){

FreeLibrary(hModule);

//MessageBox("아이콘 등록에 실패하였습니다. Shell Version이 낮습니다.", "에러", MB_ICONSTOP);

return FALSE;

}

}


//  실제 대상파일이 존재하는지 체크하는 루틴추가.

//if( !IsFileExist( pszFilePath ))  return TRUE;

 

CString strTempPath;

// 아이콘의 이름 설정이 안되었을 경우 기본 이름으로 설정 : *.exe의 바로가기

if( pszTitle == NULL ) {

TCHAR szFileName[MAX_PATH];

memset( szFileName, 0x00, sizeof(szFileName) );


TCHAR szFilePath[MAX_PATH];

memset( szFilePath, 0x00, sizeof(szFilePath) );


lstrcpy( szFilePath, pszFilePath );


TCHAR *pszToken;

pszToken = strtok( szFilePath, _T("\\"));


while( pszToken != NULL ){

lstrcpy(szFileName, pszToken);

pszToken = strtok(NULL, _T("\\"));

}

  

strTempPath.Format(_T("\\%s%s"), szFileName, _T("의 바로가기.lnk") );

pszTitle = strTempPath.GetBuffer( strTempPath.GetLength() );

}

BOOL bResult = TRUE;


HRESULT hResult;

    IShellLink* pShellLink;

IPersistFile* pPersistFile;


TCHAR szDesktopPath[MAX_PATH];

TCHAR szQuickLanchPath[MAX_PATH];

TCHAR szStartMenuPath[MAX_PATH];


memset( szDesktopPath, 0x00, sizeof(szDesktopPath) );

memset( szQuickLanchPath, 0x00, sizeof(szQuickLanchPath) );

memset( szStartMenuPath, 0x00, sizeof(szStartMenuPath) );


// 바탕화면 아이콘이 저장될 경로 설정

//SHGetSpecialFolderPath(NULL, szDesktopPath, MAX_PATH );

if( FAILED( fnShGetFolderPath(NULL, CSIDL_DESKTOP , NULL, 0, szDesktopPath) ) )  return FALSE;

LPSTR strDesktopPath = lstrcat( szDesktopPath, pszTitle );

 

// 빠른 실행 아이콘이 저장될 경로 설정

if( FAILED( fnShGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, szQuickLanchPath) ) )  return FALSE;

LPSTR strQuickLanchPath = lstrcat( szQuickLanchPath, _T("\\Microsoft\\Internet Explorer\\Quick Launch") );

strQuickLanchPath = lstrcat( szQuickLanchPath, pszTitle );


// 시작메뉴

if( FAILED( fnShGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, 0, szStartMenuPath) ) )  return FALSE;

LPSTR strStartMenuPath = lstrcat( szStartMenuPath, pszTitle );


if( !bOverWrite ){

// 바탕화면 아이콘이 있으면 

if( IsFileExist( (LPCTSTR)strDesktopPath ) ) bDesktop = FALSE;

// 빠른실행 아이콘이 있으면 

if( IsFileExist( (LPCTSTR)szQuickLanchPath ) ) bQuickLanch = FALSE;

// 시작메뉴  아이콘이 있으면 

if( IsFileExist( (LPCTSTR)szStartMenuPath ) ) bStartMenu = FALSE;


if( !bDesktop && !bQuickLanch && !bStartMenu ) return TRUE;

}

  

    // COM Object 초기화

    CoInitialize(NULL);


 // IShellLink 객체를 생성하고 포인터를 구함

    hResult = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &pShellLink);


    if( SUCCEEDED(hResult) ){

  // 단축아이콘의 대상체와 설명을 설정한다.

CString exe_dir_str;

TCHAR drive[_MAX_DRIVE] = _T(""), dir[_MAX_DIR] = _T("");

TCHAR fname[_MAX_FNAME] = _T(""), ext[_MAX_EXT] = _T("");

_tsplitpath( pszFilePath, drive, dir, fname, ext );

exe_dir_str.Format("%s%s", drive, dir);


        pShellLink->SetPath( pszFilePath );

        pShellLink->SetDescription( pszDescription );

        pShellLink->SetArguments(_T(""));

pShellLink->SetWorkingDirectory( exe_dir_str );


  // 저장하기 위해 IPersistFile 객체 생성

        hResult = pShellLink->QueryInterface( IID_IPersistFile, (LPVOID *) &pPersistFile );


  // 유니코드로 파일 패스를 변경한 후 저장

if( SUCCEEDED(hResult) ){

            

WORD wszDesktop[MAX_PATH];

memset( wszDesktop, 0x00, sizeof(wszDesktop) );

            MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, strDesktopPath, -1, LPWSTR(wszDesktop), MAX_PATH );


WORD wszQuickLanch[MAX_PATH];

memset( wszQuickLanch, 0x00, sizeof(wszQuickLanch) );

MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, strQuickLanchPath, -1, LPWSTR(wszQuickLanch), MAX_PATH );

WORD wszStartMenu[MAX_PATH];

memset( wszStartMenu, 0x00, sizeof(wszStartMenu) );

MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, strStartMenuPath, -1, LPWSTR(wszStartMenu), MAX_PATH );


// shortcut 등록

  if( bDesktop ){

if( !pPersistFile->Save( LPWSTR(wszDesktop), TRUE ) ) bResult = FALSE;

  }


  //Quick Lauch에 등록 

  if( bQuickLanch ){

if( !pPersistFile->Save( LPWSTR(wszQuickLanch), TRUE ) ) bResult = FALSE;

  }

  //bStartMenu에 등록 

  if( bStartMenu ){

if( !pPersistFile->Save( LPWSTR(wszStartMenu), TRUE ) ) bResult = FALSE;

  }

  

  pPersistFile->Release();


  // 아이콘 재설정

::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST | SHCNF_FLUSH, NULL, NULL);

}

pShellLink->Release();


//COM 해제

CoUninitialize();

FreeLibrary(hModule);


return bResult;

    }else{

FreeLibrary(hModule);

    }

    return bResult;

}



* 사용법

BOOL ret = CreateShortcut( "c:\\실행폴더\\aaa.exe", "\\aaa.lnk", "테스트입니다.", TRUE, TRUE, TRUE, TRUE);

c:\\실행폴더\\aaa.exe 파일을 위한 단축아이콘 생성을 위한 것으로 aaa.lnk 는 단축아이콘 생성이름입니다. 보통 실행파일명으로 해주면 됩니다.
바탕화면, quicklaunch, startmenu 에 단축아이콘을 생성하고. 기존것이 있다면 덮어쓴다는 의미 입니다.

저는 위 함수 하나로 사용하고 있습니다.










오늘은 해당 특정폴더 안의 특정 파일이 존재하는지를 체크하는 함수 입니다.


간단하지만 막상 인터넷에서 찾아서 사용하려면 머리 아픕니다.


아래 함수 하나를 넣어놓고 호출해서 사용하시면 편리합니다.


* 소스코드


// LPCSTR lpszFilePath : 폴더 및 파일명

BOOL Util::IsFileExist(LPCSTR lpszFilePath)

{

CFileFind find_file;

if(find_file.FindFile(lpszFilePath)){

return TRUE; // 존재한다.

}


    return FALSE;

}



* 사용법


BOOL present = IsFileExist("c:\\특정폴더\\aaa.exe");


파일이 존재하면 TRUE 이겠죠...













오늘은 exe파일이나 dll, ocx 등의 파일 버젼을 읽을 필요가 있게 됩니다.


그때 읽는 함수를 알려드리겠습니다. 현재 제가 사용하고 있는 소스입니다.



* 소스코드


// CString parm_path : 파일경로

// CString parm_filename : 파일명.확장자

CString Util::GetAppVersion( CString parm_path, CString parm_filename )


        DWORD dwHandle, dwLen; 

        UINT BufLen; 

        LPTSTR lpData; 

        VS_FIXEDFILEINFO *pFileInfo; 

        CString pgm_path, ret_version;


pgm_path.Format("%s\\%s", parm_path, parm_filename);

        dwLen = GetFileVersionInfoSize( (char *)(const char *)pgm_path, &dwHandle ); 

        if (!dwLen)   return ""; 

         

        lpData = (LPTSTR) malloc (dwLen); 

        if (!lpData)   return ""; 

        if( !GetFileVersionInfo( (char *)(const char *)pgm_path, dwHandle, dwLen, lpData ) ) {   

                free (lpData); 

                return ""; 

        } 

         

        if( VerQueryValue( lpData, "\\\\", (LPVOID*) &pFileInfo, (PUINT)&BufLen ) )  {   

ret_version.Format("%d.%d.%d.%d", 

HIWORD(pFileInfo->dwFileVersionMS), LOWORD(pFileInfo->dwFileVersionMS), HIWORD(pFileInfo->dwFileVersionLS), LOWORD(pFileInfo->dwFileVersionLS)

);

                //*MajorVersion = HIWORD(pFileInfo->dwFileVersionMS); 

                //*MinorVersion = LOWORD(pFileInfo->dwFileVersionMS); 

                //*BuildNumber = HIWORD(pFileInfo->dwFileVersionLS); 

                //*RevisionNumber = LOWORD(pFileInfo->dwFileVersionLS); 

                free (lpData); 

                return ret_version; 

        } 

         

        free (lpData); 

m_debug_str.Format("[GetAppVersion] %s %s %s", parm_path, parm_filename, ret_version); AddLog(m_debug_str);


        return ret_version; 


* 사용법

CString ver = GetAppVersion("c:\\폴더", "aaa.exe")'


GetAppVersion 함수는 고정적으로 넣어놓고, 호출만 하면 해당 파일의 버젼이 읽히게 됩니다.

참 쉽죠~~













오늘은 개발할 때 디버깅을 위해 파일로 로그를 남기는 저의 방법을 알려드리려고 합니다.


일반적으로 함수 하나로 해서 로그를 많이 남기게 됩니다.



* 소스코드


// parm_log : 남길 로그

void Util::AddLog(CString parm_log)

{


CTime t = CTime::GetCurrentTime();

CString log_str;

log_str.Format("[%04d/%02d/%02d %02d:%02d:%02d] %s", t.GetYear(), t.GetMonth(), t.GetDay(), t.GetHour(), t.GetMinute(), t.GetSecond(), parm_log);

CString file_str, make_str;

file_str.Format("%s\\log\\%04d%02d%02d_log.txt", "c:\\로그폴더경로", t.GetYear(), t.GetMonth(), t.GetDay() );

FILE *fp = fopen((const char *)file_str, "a+t");

if(!fp) return;

fprintf(fp, "%s\n", (const char *)log_str);

fclose(fp);

}


* 사용법


AddLog("로그입니다.");



위 코드는 말그대로 지정된 c:\\로그폴더경로 란 경로에 로그를 남기게 됩니다.


로그를 남길 때 GetCurrentTime() 함수를 사용하여 현재 시스템시간을 얻어서 a+t 타입, 즉. 텍스트타입의 add 방식으로 파일에 추가하라는 의미있니다.


위 함수를 지정해 놓고 사용하시면 편리합니다.













유튜브영상을 편하게 보자.. 유튜브서치(YouTubeSearch) 입니다.


현재 베타버젼이고요.. 좀더 기능을 추가예정인데 급한데로 사용하고싶은 분들께 배포합니다. 


기능추가요청을 댓글로 달아 주시면 반영할 수 있다면 반영할 예정입니다.


보통 유튜브 사이트에 들어가서 보게 되면 사이트의 틀과 기타 항목들 때문에 집중있게 영상을 보기 힘들고

원하는 크기로 보기가 힘든 부분이 있어 이 부분을 일반 곰플레이어처럼 비슷하게 만들었습니다. (이미지참조)

 

* 기본정보


프로그램명 : 유서치 (YouSearch)

운영체제 : 제힌없음

라이센스 : 프리웨어 - 절대로 해킹코드 없는 순수 프로그램임을 보증합니다.

다운로드

YouSearch_1_0_0_1.zip



검색어 중에 스포츠 쪽 관련된 내용 중 광고수익이 많이 발생하는 영상은 Youtube API 로는 볼수가 없더라고요. 그런 영상은 유뷰브 사이트에서 직접 보셔야 합니다.

그리고, 재생목록이 있는 채널리스트 같은 것은 배제하였습니다. 하려고 하니 작업이 좀더 필요해서 당장 시간이 없어서..ㅎㅎ

향후에 이 부분도 적용할 예정에 있습니다.



* 설치


압축푸셔서 ypusearch란 폴더를 만들어 안에 넣으시면 됩니다.


* 이미지 및 설명


프로그램 실행 시 화면입니다.^^ 오른쪽에 빨간 검색창 보이시죠? 거기에 검색어를 입력하시면 됩니다. 

재생목록은 검색에서 배제하였습니다.~


검색결과 보이시죠?.. 사이트에서 검색한 것과 대부분 같습니다.~~

스크롤 끝에 가시면 [다음] 버튼이 보이고 다음페이지로 넘어갈 수 있으며 한 리스트에 50 건씩 보입니다.



이미지를 클릭하게 되면 좀 기다리면 왼쪽에서 영상을 보실 수 있습니다.

위 이미지에서 보면...

(2) 클릭하면 오른쪽 리스트창이 사라집니다. ( 플레이어 같겠죠..)

(1) 클릭 하면 사라진 리스트창이 다시 나타납니다.

아래 가운데 보시면 (3) 부분은 리사이즈가 된다는 걸 표시한건데.. 잘 아시다싶이 

마우스를 저 근처에 갖다데면 마우스가 대각선화살표로 바뀌고, 리사이즈할 수 있습니다.


보이시죠..ㅎㅎ 운하는 크기로 작해 만들어 놓고 보시면 편해요..

다만 아쉬운게 하단 컨트롤도 사라지면 좋을 것 같은데 지원을 안하네요..ㅎㅎ



첨부파일을 받으셔서 즐겨보세요..~~









아주아주 예전에 제가 개발한 프로그램입니다.


플래시 게임을 좀 편리하고, 쉽게 사용하고, 해당 게임 사이트에 들어가지 않고도 사용할 수 있습니다.

기억을 하시는 분도 계시겠지만. 한동안 서버를 못구해서. 잠수타고 있다가 다시 시작합니다.



* 기본정보


프로그램명 : 플가 (FLGA)

운영체제 : 제힌없음

라이센스 : 프리웨어 - 절대로 해킹코드 없는 순수 프로그램임을 보증합니다.

다운로드 : 

Flga_1_3.zip





버젼업이 되게 되면 제 블로그에 오셔서 신규프로그램을 받으시면 됩니다. 

버전업 정보는 기존 프로그램 사용할 때 표시가 됩니다.


* 설치


첨부파일을 다운받아 압축을 푼 후 원하는 폴더에서 flag.exe을 실행하면 끝~~


* 이미지 및 설명


실행화면이며, 검색을 하거나, 메뉴를 클릭하면 해당 리스트가 나온다.



창크기가 고정이 된 것이 아니라서 원하는 크기로 프로그램 크기를 변경할 수 있습니다.



이미지 클릭 시 게임 상세설명을 볼 수 있다. (상세한 설명은 없습니다. ^^ 중요 게임 키 설명만 있어요..



[게임실행] 클릭 시 나온 게임화면입니다. 


이제 게임을 즐기시면 되겠죠~~~

게임키를 까먹었을 때 상단의 [게임설명] 울 클릭하면 설명화면으로 넘어갑니다.















오늘은 INI 파일을 사용하는 법에 대해 설명하고자 합니다.


일반적인 INI 함수는 WINNT\SYSTEM 에 저장되어 사용되는것이 대부분인데 이 방식은 INI파일 관리하는데 문제점이 있고.


레지스트리 함수 또한 레지스트리에서 찾기도 힘들고, 관리 또한 힘든 점이 있습니다.


아래의 함수는 특정 폴더 위치에 INI을 생성해서 관리하는 방법을 설명하고자 합니다.


일반적으로 실행되는 위치 또는 그 하위폴더에 잡게 됩니다.


* 특정폴더의 INI 읽기


// CString parm_command : command명

// CString parm_default : 없을경우 default값


CString Util::GetInformationINI(CString parm_command, CString parm_default)

{

// INI

char buffer[256] = {0, };

CString file_str, make_str;

file_str.Format("%s\\read.ini", 읽을위치);


GetPrivateProfileString("COMMON", parm_command, parm_default, buffer, 255, file_str);    

        // file_str의 ini에서 COMMON이란 section 의 parm_command 값 읽기

return buffer;

}


* 사용법

CString aaa = m_util.GetInformationINI("COM_STORE_CODE", "")



* 특정폴더의 INI 에 쓰기


// CString parm_data : 쓸 정보

void Util::SetInformation(CString parm_command, CString parm_data)

{

char buffer[256] = {0, };

CString file_str, make_str;

file_str.Format("%s\\read.ini", m_exe_str);

WritePrivateProfileString("COMMON", parm_command, parm_data, file_str);

}


* 사용법

m_util.SetInformation("COM_STORE_CODE", "1234");



참 쉽죠~~

마니마니  사용해주세요.~












오늘은 문자 또는 문자열을 split 하는 방법에 대해 설명합니다.


보통 자바스크립트나 자바 등에서는 쉽게 제공이 되지만 C++에서는 직접 구현을 해줘야 합니다.


여러군데에서 설명나온걸 마니 보았지만 실제 업무에서 적용되어서 운영되는 것인지 명확하지 않기 때문에 제가 현재 사용하고 있는 함수를 공개합니다.


* 문자단위의 split


int Util::Split(LPCTSTR lpszExpression, TCHAR chDelimiter, CStringArray &result)

{

int nCount = 0;

CString strSub;


while (AfxExtractSubString(strSub, lpszExpression, nCount++, chDelimiter)){

strSub.TrimLeft();

strSub.TrimRight();

result.Add(strSub);

}

return nCount;

}



위 함수는 하나의 문자에 대해 분할할 때 사용합니다. 걀과는 CStringArray 로 전달됩니다.
그리고 return 은 분할 된 개수입니다.

* 사용법
CStringArray protocol_array;
m_util.Split(card_confirm_protocol, '*', protocol_array);
    AfxMessageBox(protocol_array[0]);

아주 쉽죠..

* 문자열의 split

int Util::Splits(CString string, CString sep, CStringArray& array)
{

int nCount = 0;
while (string.GetLength() > 0){
int Pos = string.Find(sep);
if (Pos != -1){
array.Add(string.Left(Pos));
string = string.Mid(Pos + sep.GetLength());
nCount++;
if(string.IsEmpty()){
array.Add("");
nCount++;
}else{
array.Add(string);
string = "";
nCount++;
}
}
return nCount;

}

위 함수는 문자열을 분할할 때 사용합니다.
기존 인터넷에 설명이 나온것 중에 특정문자열에 대해 분할이 정상적으로 이루어 지지 않는 것들이 좀 있는데 
위 함수는 그것까지 정상처리되도록 작업이 된 함수입니다.


* 사용법

          CStringArray str_array; 

m_util.Splits(is_parm, "||||", str_array);
                AfxMessageBox(str_array[0]);


위 두 함수를 쌍으로 설정해 놓고 사용하시면 유연하게 사용하실 수 있습니다.

그럼~~






+ Recent posts