오늘은 자바스크립트에서 정수부 또는 소수점  반올림 관련 함수에 대해 설명하고자 합니다.


당연히 Math.round 함수를 사용하면 되지만 좀 더 경우의 수가 많은 경우에도 문제없이 사용하려면 좀 다듬어서 함수를 만들어서 사용해야 합니다.



* 소스코드


// n : 수치

// digits : 자를 소수점 자리수

function RoundXL(n, digits) {


var str_n = String(n); //숫자를 스트링으로 변환 

str_n = replaceAll(str_n, ",", "");

var float_n = parseFloat(str_n);


        // 소수부 반올림

if (digits >= 0) return parseFloat(float_n.toFixed(digits)); 


        // 정수부 반올림 ( digit값이 - 이면 정수부 상위 부분이 반올림 )

digits = Math.pow(10, digits); 

var t = Math.round(float_n * digits) / digits;


return parseFloat(t.toFixed(0));

}


* 사용법


var aa = RoundXL(123,456, 2);    // result : 123.46

var aa = RoundXL(123,456, -1);   // result : 120



이 함수만 있으면 소수점이든, 정수든 원하는 위치에서 반올림이 가능합니다.















오늘은 자바스크립트에서 DoModal 을 사용하는 방법에 대해 설명하고자 합니다.


C++ 에서는 DoModal 함수가 있어서 Modal 방식의 창을 띄울 수 있는데


자바스크립트에서도 그와 같은 함수가 있습니다.


showModalDialog 라는 함수입니다. 이 함수를 좀더 쉽게 다룰 수 있도록 함수화 해서 만든게 있어서 알려드립니다. (IE기준)


* 소스코드


// parm_url : 호출할 페이지

// w : 가로크기 (px)

// h : 세로크기 (px)

function DoModal(parm_url, w, h)

{

var pop_layer = null;

var is_style="edge:raised;center:yes; dialogwidth:"+w+"px; dialogheight:"+h+"px; scroll:yes; resizable:no; status:no; select:yes;"; 

        // 창 틀의 두께를 의미하며, sunken이 두텁고, raised가 얇음. 

return showModalDialog(parm_url, window, is_style);

}


* 사용법


var mm = DoModal('modal.asp', 300, 400);


위 함수처럼 사용하시면 쉽게 모달을 구현할 수 있습니다.










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


보통 메인 프로그램이 서브프로그램을 강제로 종료시킬 때 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");


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











안녕하세요.. 잠시 쉬어가려합니다. 


제가 나이가 좀 있다보니 요즘의 vc++ 툴인 2010 버젼 같은걸 잘 쓰질 못해서.. 저는 간간히 C++ 을 개발을 하는데.


여전히 6.0 을 사용합니다. ㅎㅎ


새로운 툴이 익숙하지 않고, warning level 이 높아서 익숙하지 않더라고요..


함수를 가져다 쓰실 때 에러가 날 수는 있는데 해당 툴에 맞게 좀 손보고 사용하실면 될 것 같습니다.


그럼 많이 많이 이용해 주세요. ^^



'시스템' 카테고리의 다른 글

[초대장받기] 드디어 티블로거가 되었습니다.  (0) 2016.09.27








오늘 소개하려고 하는 영상은 유튜브에 올라온 자석 도미노 영상..


정말 공들여서 만든 영상이네요..


아마 물리학에 대해 잘 아시는 분이 만든 듯합니다. ㅎㅎ


이 영상은 반드시 봐야할 영상이네요~


티비플] 한번보면 멈출수없는 자석도미노



후회 안하실거에요..


******************************************************************************

유튜브사이트에 가지 않고도 곰플레이어처럼 플레이 할 수 있는 방법을 찾으세요?

원하신다면 아래 저의 블로그에서 확인해 주세요.

http://neoryuee.tistory.com/13

******************************************************************************












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

보통 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 이겠죠...













오늘은 애벌레를 접어 보았습니다. 일반 쉽게 접는 애벌레가 아니고 실제 애벌레 같은 느낌입니다.


한 장으로 접는 것이 아니라 작은 종이를 여러 개로 접는 것인데 단순노동이긴 하지만 나름 힘듭니다.



* 나의 작품





늘어났다 줄었다고 하고, 실제 애벌레 같은 느낌이 듭니다. 애들이 아주아주 좋아할 듯..




* 애벌레 접기



Origami Doodlebug (Yami Yamauchi)


아주 아주 신기해요..ㅎㅎ





'나의취미' 카테고리의 다른 글

[고급] 유니콘 접기  (0) 2016.09.27








오늘은 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 함수는 고정적으로 넣어놓고, 호출만 하면 해당 파일의 버젼이 읽히게 됩니다.

참 쉽죠~~









+ Recent posts