간혹 컴파일 하다보면 이런 경고가 튀어 나올때가 있다. (주로 warning level이 높게 지정된 경우 - 4정도? - 에 튀어나온다)

 

warning C4100: 'argc' : unreferenced formal parameter
warning C4100: 'argc' : 참조되지 않은 형식 매개 변수입니다.

 

한마디로, 선언은 해놨지만 쓰이지 않고 있다는 소리다.

Console 프로그램의 argc, argv같은 경우나, 프로토타이핑할 때 함수나 클래스의 껍데기만 만들다 보면 주로 발생한다. 
사실 별로 상관은 없으니까 무시하면 된다...

그러나!! 계속 눈에 거슬리니까 신경 쓰인다. (당신도 변태? -_-+)

이럴땐 UNREFERENCED_PARAMETER(...) 매크로를 사용하자.

 

void SomeFunction(int arg1)
{
    UNREFERENCED_PARAMETER(arg1);
}
 

실제 구현은 다음과 같다. (winnt.h에 선언되어 있다. windows.h를 include하면 알아서 따라온다.)

 

#define UNREFERENCED_PARAMETER(P)          (P)

 

그냥, warning없애주기 위해 한번 쓱 건드리고 지나가는 역활밖에 안한다. -_-;
성능에 영향도 없는데다, 오류도 없애주니까.. 신경쓰일땐 애용해 보자.

(물론 #pragma warning( disable : 4100 )로 간단하게 없애는 방법도 있지만.. 진정한 변태라면!!)

 

이 외에도
DBG_UNREFERENCED_PARAMETER, DBG_UNREFERENCED_LOCAL_VARIABLE 등도 준비되어 있다.
입맛에 따라 골라써먹자! -_-!!

0xabababab        HeapAlloc으로 메모리 할당 후 가드 바이트에 채워진 값
0xbaadf00d         LocalAlloc(LMEM_FIXED)으로 메모리 할당된 후 초기화 되지 않은 값
0xcccccccc       초기화 되지 않은 스택 메모리
0xcdcdcdcd       메모리 할당 후 초기화 되지 않은 힙 메모리
0xdddddddd       해제된 힙 메모리
0xfdfdfdfd           할당된 메모리의 전후 가드용 바이트에 채워지는 값
0xfeeefeee         힙 메모리를 해제한 후 채워지는 값 [HeapFree()]
QueryPerformanceCounter 함수는 현재 cpu 틱을 받아 오는건데 i7 cpu에서 부스터 기능 때문에 제대로 동작하지 않을 가능성이 있다. 그렇다고 timeGetTime을 쓰자니 정밀하지 않고, 이래저래 생각 끝에 그래도 아직은 QueryPerformanceCounter를 써야 하지 않을까 싶다.

예제)
using namespace std;

double OutPutTime( const LARGE_INTEGER& freq, const LARGE_INTEGER& startTime, const LARGE_INTEGER& endTime )
{
return ((double)(endTime.QuadPart - startTime.QuadPart) / freq.QuadPart) * 1000;
}

int _tmain(int argc, _TCHAR* argv[])
{
LARGE_INTEGER freq, startTime, endTime;

QueryPerformanceCounter(&startTime); //시작시간


QueryPerformanceCounter(&endTime); //종료시간
_tprintf( TEXT("/%lf ms\n"),  OutPutTime( freq, startTime, endTime ) ); //경과시간


getchar();

return 0;
}

wsprintf에서는 float형을 지원하지 않는데, 이럴 때 사용 할 수 있는 함수가 _stprintf_s이다.
릴리즈에서만 어떠한 문제가 생겨서 디버깅 할 때 사용할 수 있는 함수이다.
평소에는 VS Output창에 보여주지만 DebugView를 쓰면 단독 실행중일 때도 사용가능하다.
여러모로 편리하지만 배포할 때는 이 코드를 빼줘야 한다.
나는 디파인으로 걸어서 릴리즈일때는 사용하지 않도록 한다.

void OutputLog( LPCTSTR pszStr, ... )
{
#ifdef OUTPUT_LOG_HSSON
  const int nBufSize = 8192;
  
  TCHAR szMsg[nBufSize] = {0, };
  va_list args;  
  va_start(args, pszStr);  
  _vsntprintf_s(szMsg, nBufSize, pszStr, args);
  va_end(args);
  OutputDebugString(szMsg);
#else
  UNREFERENCED_PARAMETER(pszStr);
#endif
}

처음 다이렉트X SDK 설치 후 빌드 에러 날 때

1)
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib, "winmm.lib")

2)
VS에서 include, lib 폴더 세팅

 

bool CTotalUpdateDlg::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

        {

            //printf("process name : %s\n", me32.szModule);

 

            if(me32.szModule == sProcessName)

            {

                CloseHandle (hModuleSnap);

                return true;

            }

 

        }

        while(Module32Next(hModuleSnap, &me32));

    }

 

    CloseHandle (hModuleSnap);

    return false;

}

 

bool CTotalUpdateDlg::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);

                    }

                    //printf("process exit\n");

                    CloseHandle(hProcess);

                    return true;

                }

            }

        }

        while (Process32Next(hProcessSnap, &pe32)); //다음프로세스의정보를구하여있으면루프를돈다.

    }

    CloseHandle (hProcessSnap);

    return true;

}

사용자 삽입 이미지

#include "stdafx.h"


class CCustomListBox : public CListBox

{

public:

    CCustomListBox()

    {

        m_rgbNormalText = RGB( 0, 0, 0 );

        m_rgbNormalBack = RGB( 255, 255, 255);

        m_rgbWarningText = RGB( 255, 0, 0 );

        m_rgbWarningBack = RGB( 255, 255, 0 );


        m_nHeight = 20;

        m_szMargin = CRect(5, 0, 0, 0);

    }

    COLORREF m_rgbNormalText, m_rgbNormalBack; // 일반글자색과배경색

    COLORREF m_rgbWarningText, m_rgbWarningBack; // 경고일때

    UINT m_nHeight; // 셀의높이

    CRect m_szMargin; // 글자의마진


    int AddString(LPCTSTR lpszItem)

    {

        int n = CListBox::AddString( lpszItem );

        SendMessage(WM_VSCROLL, SB_BOTTOM, NULL);

        return n;

    }


public:

    virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);

    virtual void MeasureItem(LPMEASUREITEMSTRUCT /*lpMeasureItemStruct*/);



};




#include "ListBoxEx.h"


void CCustomListBox::DrawItem(LPDRAWITEMSTRUCT pDIStruct)

{

    CDC dc;


    // 코드를간결하게하기위하여전달된HDC를CDC에어태치한다.

    if( !dc.Attach( pDIStruct -> hDC ) )

        return;


    // 현재전달된아이템이선택되어진넘인이확인한다.

    if( pDIStruct -> itemState & ODS_SELECTED )

    {

        // 속성에맞게글자색, 배경색상을지정한다.

        dc.SetTextColor((0x00FFFFFF & ~(GetSysColor(COLOR_WINDOWTEXT))));

        dc.SetBkColor(GetSysColor(COLOR_HIGHLIGHT));

        dc.FillSolidRect(&pDIStruct->rcItem, GetSysColor(COLOR_HIGHLIGHT));

    }

    else

    {

        dc.SetTextColor(m_rgbNormalText);

        dc.SetBkColor(m_rgbNormalBack);

        dc.FillSolidRect(&pDIStruct->rcItem, m_rgbNormalBack);

    }


    // 아이템의인덱스가-1이아니면

    if(pDIStruct->itemID != -1)

    {

        // 선택된아이템의문자열을읽어온다.

        CString m_SelText;

        GetText(pDIStruct->itemID, m_SelText);


        if( wcsstr( m_SelText, _T("[경고]") ) )

        {

            dc.SetTextColor(m_rgbWarningText);

            dc.SetBkColor(m_rgbWarningBack);

            dc.FillSolidRect(&pDIStruct->rcItem, m_rgbWarningBack);

        }


        // 만약선택된아이템이디저블속성이면글자색상을회색으로

        if(pDIStruct->itemState & ODS_DISABLED)

            dc.SetTextColor(::GetSysColor(COLOR_GRAYTEXT));


        // 배경은투명속성으로

        dc.SetBkMode(TRANSPARENT);


        // 글자를그릴영역의여백을조절한다..

        CRect rcText = pDIStruct->rcItem;

        rcText.left += m_szMargin.left;

        rcText.top += m_szMargin.top;

        rcText.right -= m_szMargin.right;

        rcText.bottom -= m_szMargin.bottom;


        dc.DrawText(m_SelText, rcText, DT_VCENTER | DT_SINGLELINE);

    }


    dc.Detach();

}


void CCustomListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)

{

    lpMeasureItemStruct->itemHeight = m_nHeight;

}



단축키 설명
Ctrl + Tab Edit하고 있는 Child Window 간의 이동
Ctrl + F4 현재 Edit하고 있는 Child Window를 닫기
Ctrl + I 문자열 입력 점진적으로 문자열 찾기 (Incremental Search)
Ctrl + F3 현재 커서에 있는 문자열 찾기 fowared
(블록 지정 안 해도 됨)
Ctrl + Shift + F3 현재 커서에 있는 문자열 찾기 backward
F3 찾은 문자열에 대한 다음 문자열로 이동 (Next Search)
Ctrl + H 문자열 찾아 바꾸기 (Replace)
Ctrl + Left/Right Arrow 단어 단위로 이동
Ctrl + Delete 또는 Backspace 단어 단위로 삭제
Ctrl + F2 현재 라인에 북마크 지정/해제
F2 지정된 다음 북마크로 이동
Ctrl + Shift + F2 지정된 모든 북마크를 해제
F9 현재 라인에 Breakpoint를 지정/해제
Ctrl + Shift + F9 현재 Edit하고 있는 소스파일에 지정된 모든 Breakpoint 해제
Ctrl + ] '{'괄호의 짝을 찾아줌 ('{'에 커서를 놓고 눌러야 함}
Ctrl + J, K #ifdef 와 #endif의 짝을 찾아줌
Ctrl + L 한 라인을 클립보드로 잘라내기 (Cut)
Ctrl + Shift + L 한 라인을 삭제
Alt + Mouse 블록 설정 세로로 블록 설정하기 (마우스로)
Ctrl + Shift + F8 세로로 블록 설정하기 (키보드로), 취소할 때는 Esc키를 눌러야 함
블록 설정 -> Tab 선택된 블록의 문자열을 일괄적으로 들여쓰기(Tab) 적용
블록 설정 -> Shift + Tab 선택된 블록의 문자열을 일괄적으로 내어쓰기 적용
Alt + F8 인덴트 정리. 범위 선택 후 사용하면 해당 범위를 표준 인덴트로 바꾸어줌.
Shift + F9 디버그 모드에서 해당 변수를 바로 Watch Window에 등록.
Ctrl + U 선택된 영역을 소문자로 바꿈
Ctrl + Shift + U 선택된 영역을 대문자로 바꿈
Ctrl + Shift + 8 문단기호 표시/감추기 : Tab은 ^, Space는 .으로 표시
Ctrl + D 툴바의 찾기 Editbox로 이동
Ctrl + Up/Down Arrow 커서는 고정시키고 화면만 스크롤 시키기
Shift + Alt + 커서 이동
Alt + 마우스 드래그
세로로 영역 선택
Shift + F12 선언으로 이동

+ Recent posts