'As a developer'에 해당되는 글 44건
- 2013.01.03 Windows SDK 6.1 링크
- 2012.12.04 뮤텍스로 중복 프로세스 실행 방지
- 2012.12.04 특정 IP, Port 에 연결된 IP 구하기
- 2012.10.11 specialfolder
- 2012.10.11 Invalid parameter<
- 2012.10.09 SetupAPI
- 2012.09.26 탭 컨트롤에 gif 넣기
- 2012.09.25 파일 버전 정보 얻기
- 2012.09.14 NSIS INI파일 연동
- 2012.09.14 NSIS INI파일 연동
Windows SDK 6.1 링크
Windows SDK for Windows Server 2008 and .NET Framework 3.5
http://www.microsoft.com/en-us/download/details.aspx?id=24826
뮤텍스로 중복 프로세스 실행 방지
[MFC] 뮤텍스로 프로세스 중복실행 방지하기
HANDLE hMutex = NULL;
BOOL Cnet_server_dlgApp::InitInstance()
{
// 프로그램이 2개 이상 실행되지 않도록 하기
hMutex = CreateMutex (NULL, TRUE, _T("심플_서버"));
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
// 이미 실행중인 윈도우를 보여주기
CWnd * pWnd = CWnd::FindWindow(_T("#32770"), NULL);
if (pWnd != NULL)
pWnd->ShowWindow (SW_SHOW);
return FALSE;
}
return TRUE;
}
specialfolder
SHGetSpecialFolderPath 사용
CSIDL_ADMINTOOLS
CSIDL_ALTSTARTUP
CSIDL_APPDATA
CSIDL_BITBUCKET
CSIDL_COMMON_ADMINTOOLS
CSIDL_COMMON_ALTSTARTUP
CSIDL_COMMON_APPDATA
CSIDL_COMMON_DESKTOPDIRECTORY
CSIDL_COMMON_DOCUMENTS
CSIDL_COMMON_FAVORITES
CSIDL_COMMON_PROGRAMS
CSIDL_COMMON_STARTMENU
CSIDL_COMMON_STARTUP
CSIDL_COMMON_TEMPLATES
CSIDL_CONTROLS
CSIDL_COOKIES
CSIDL_DESKTOP
CSIDL_DESKTOPDIRECTORY
CSIDL_DRIVES
CSIDL_FAVORITES
CSIDL_FONTS
CSIDL_HISTORY
CSIDL_INTERNET
CSIDL_INTERNET_CACHE
CSIDL_LOCAL_APPDATA
CSIDL_MYMUSIC
CSIDL_MYPICTURES
CSIDL_NETHOOD
CSIDL_NETWORK
CSIDL_PERSONAL
CSIDL_PRINTERS
CSIDL_PRINTHOOD
CSIDL_PROFILE
CSIDL_PROGRAM_FILES
CSIDL_PROGRAM_FILES_COMMON
CSIDL_PROGRAMS
CSIDL_RECENT
CSIDL_SENDTO
CSIDL_STARTMENU
CSIDL_STARTUP
CSIDL_SYSTEM
CSIDL_TEMPLATES
CSIDL_WINDOWS
Invalid parameter<
algorithm의 sort 를 사용할 때 Invalid Parameter< Assert가 발생 할 경우가 있다.
VS2005 이상에서만 발생하고 컨테이너 list 나 vector 나 상관 없이 발생한다.
MS에서는 strict-weak-ordering 이라는 개념이 적용되어 그렇다고 한다.
문제는 predicate function에서 같을 경우 TRUE를 리턴 하면 발생한다.
이전엔 전혀 문제 없이 사용하던 코드이고, 논리적으로도 문제가 없어 보이기 때문에 의심받지 않는
코드에서 발생하는게 함정이긴하다.
ex)
struct SortList
{
static BOOL Compare(int a, int b)
{
return a <= b ? TRUE : FALSE;
}
}
위 코드는 전혀 문제 없어 보인다. 하지만 위의 Assert가 발생한다. 간단히 에러만 피한다면
TRUE : FALSE; 를 FALSE : TRUE; 로 고치면 된다.
핵심은 비교하는 두 파라미터가 같을 경우 FALSE를 리턴 해야 한다는 것.
asc, desc 는 논리에 따라 구현 하면 된다.
SetupAPI
SetupAPI를 사용해서
드라이버 인스턴스 아이디 등 필요한 정보는 다 있다.
탭 컨트롤에 gif 넣기
BOOL SetTabCtrl()
{
m_imageList.Create(24, 17, ILC_COLORDDB, 3, 3);
CImage imageSW;
imageSW.Load(L".\\res\\1.gif");
HBITMAP hSW = imageSW.Detach();
CBitmap bmpSW;
bmpSW.Attach((HGDIOBJ)hSW);
m_imageList.Add(&bmpSW, RGB(255, 0, 255));
CImage imageSystem;
imageSystem.Load(L".\\res\\2.gif");
HBITMAP hSystem = imageSystem.Detach();
CBitmap bmpSystem;
bmpSystem.Attach((HGDIOBJ)hSystem);
m_imageList.Add(&bmpSystem, RGB(255, 0, 255));
CImage imageUser;
imageUser.Load(L".\\res\\3.gif");
HBITMAP hUser = imageUser.Detach();
CBitmap bmpUser;
bmpUser.Attach((HGDIOBJ)hUser);
m_imageList.Add(&bmpUser, RGB(255, 0, 255));
// 아이콘 로드 - 아이콘 배경은 검은색으로 나옴
// m_imageList.Add(AfxGetApp()->LoadIconW(IDR_MAINFRAME));
m_cTabMain.SetImageList(&m_imageList);
TCITEM item;
item.mask = TCIF_IMAGE | TCIF_TEXT;
item.pszText = L"1";
item.iImage = 0;
this->m_cTabMain.InsertItem(0, &item);
item.pszText = L"2";
item.iImage = 1;
m_cTabMain.InsertItem(1, &item);
item.pszText = L"3";
item.iImage = 2;
m_cTabMain.InsertItem(2, &item);
return TRUE;
}
파일 버전 정보 얻기
CString GetCurrentVersion()
{// 현재 버전 얻어 옴
WCHAR szPath[512] = {0,};
GetModuleFileNameW(AfxGetInstanceHandle(), szPath, _countof(szPath));
DWORD dwVersion;
DWORD dwVersionLen = GetFileVersionInfoSizeW(szPath, &dwVersion);
if(dwVersionLen < 0)
return NULL;
HANDLE hVersionInfo = GlobalAlloc(GMEM_MOVEABLE, dwVersionLen);
LPVOID pVersionInfo = GlobalLock(hVersionInfo);
BOOL bRet = GetFileVersionInfoW(szPath, dwVersion, dwVersionLen, pVersionInfo);
WCHAR* pszVersion = NULL;
UINT uiVersionLen;
CString strVersion;
VS_FIXEDFILEINFO* pFileInfo;
if( VerQueryValueW(pVersionInfo, L"\\", (void**)&pFileInfo, &uiVersionLen) )
{
strVersion.Format(L"%u.%u.%u.%u",
HIWORD(pFileInfo->dwFileVersionMS), LOWORD(pFileInfo->dwFileVersionMS),
HIWORD(pFileInfo->dwFileVersionLS), LOWORD(pFileInfo->dwFileVersionLS));
strVersion.ReleaseBuffer();
}
GlobalUnlock(hVersionInfo);
GlobalFree(hVersionInfo);
return strVersion;
}
NSIS INI파일 연동
http://forums.winamp.com/showthread.php?t=346431&highlight=script
Function .onInit
ReadINIStr $v_major "\AA\my.ini" "Versiuni" "major"
ReadINIStr $v_minor "\AA\my.ini" "Versiuni" "minor"
ReadINIStr $v_build "\AA\my.ini" "Versiuni" "build"
ReadINIStr $v_revis "\AA\my.ini" "Versiuni" "revision"
FileOpen $R0 "version.nsh" w
FileWrite $R0 "!define v_major '$v_major'"
FileWrite $R0 "$\r$\n"
FileWrite $R0 "!define v_minor '$v_minor'"
FileWrite $R0 "$\r$\n"
FileWrite $R0 "!define v_build '$v_build'"
FileWrite $R0 "$\r$\n"
FileWrite $R0 "!define v_revis '$v_revis'"
FileClose $R0
FunctionEnd