Visual Studio 2010의 가장 큰 특징중의 하나는 바로 C+0 Lamda  표현식을 사용할 수 있는 거다.

이 Lamda 표현식은 다른 언어 특히 루비나 파이썬과 같은 프로그래밍 언어에서 많이 사용하는 문법이었는데 지금까지 C++에서는 이 편리한 Lamda 표현식을 지원하지 않다가 이제서야 지원하게 되었다.

Lamda 표현식에 대해서는 인터넷에 자료가 널려 있기 때문에 더이상 설명하지 않는다. 구글링을 하기 바란다.


Lamda 표현식을 내가 만든 프로그램에서 사용하기 위해서는 다음과 같은 과정을 따르면 된다.


1. #include <functional>

2. typedef 을 이용해서 람다 함수 원형을 정의 한다.
3. 함수의 인자로 람다 Functor 를 입력받고 이를 활용하면 된다.


여기서 설명하는 C+0 Lamda 표현식은 MS 개발툴의 경우 VS2010 이상에서만 가능하다.




====================== 헤더 파일 선언 내용 ======================
#include <functional>

template<class _Fn1> inline
BOOL CALLBACK EnumControlsProcLamda(HWND hWnd, _Fn1 * func)
{
	(*func)(hWnd);
	return true;
}
template<class _Fn1> inline
void EnumAllControls(CWnd * pWnd, _Fn1 _Func)
{
	EnumChildWindows(pWnd->GetSafeHwnd(), (WNDENUMPROC)EnumControlsProcLamda<_Fn1>, (LPARAM)&_Func);
}



====================== 사용 방법 ======================
.
.
.
// 모든 자식 컨트롤 true로 만들기
// 람다 함수 내에서 지역변수 Capture가 필요하면 [=]혹은 [&]을 이용한다.
EnumAllControls( [](HWND h){
	if( h )
	{
		if( !IsWindowEnabled(h) )
		{
			EnableWindow(h);
		}
	}
});




====================== 함수 실행 시간 구하는 Lamda함수  ======================


template <class Function>
__int64 time_call(Function&& f)
{
   __int64 begin = GetTickCount();
   f();
   return GetTickCount() - begin;
}





C++의 RTTI는 정말 편리하다.

프로그램 실행중에 변수의 자료형을 확인할 수 있으니 말이다.

RTTI는 C++ 표준서 및 MFC RTTI 지원 문서를 참고하자.


C++ RTTI : http://sweeper.egloos.com/2826160

MFC RTTI : http://anster.egloos.com/2173004


그런데 써본 사람들은 알겠지만, 이 MFC의 RUNTIME_CLASS() 매크로는 속도도 빠르고 좋은데

문제는 내포 클래스(혹은 중첩 클래스라고 말하기도 한다)에는 사용할 수 없다.

내포 클래스란...? http://initial4-blog.blogspot.kr/2012/06/c-study-512-part.html


내포 클래스는 용도에 따라서 매우 유용한 클래스인데, 이런 내포(중첩)클래스에서도 RTTI를 사용할 수 있도록 MFC의 RUNTIME_CLASS를 약간 수정해 보았다.



IMPLEMENT_DYNAMIC_NESTED() 의 사용방법은 다음과 같다.


IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)

=> nesting_class는 내부 클래스를 감싸는 외부 클래스

=> class_name은 외부 클래스 안에 있는 내포 클래스 즉, 중첩 클래스

=> base_class_name은 내포 클래스 즉, 중첩 클래스가 상속하고 있는 부모 클래스.


아래는 사용 예를 보여준다.





----------------  헤더파일에 추가할 내용 ----------------

#define RUNTIME_CLASS_NESTED(nesting_class, class_name) ((CRuntimeClass*)(&nesting_class::class_name::class##class_name))


#if _MSC_VER >= 1600
#define IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)\
					CRuntimeClass* nesting_class::class_name::GetRuntimeClass() const \
						{ return RUNTIME_CLASS_NESTED(nesting_class, class_name); } \
					CRuntimeClass* PASCAL nesting_class::class_name::GetThisClass() \
						{ return RUNTIME_CLASS_NESTED(nesting_class, class_name); }
#else
#define IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)\
					CRuntimeClass* nesting_class::class_name::GetRuntimeClass() const \
						{ return RUNTIME_CLASS_NESTED(nesting_class, class_name); } 
#endif




#ifdef _AFXDLL
#define IMPLEMENT_RUNTIMECLASS_NESTED(nesting_class, class_name, base_class_name, wSchema, pfnNew) \
	CRuntimeClass* PASCAL nesting_class::class_name::_GetBaseClass() \
		{ return RUNTIME_CLASS(base_class_name); } \
	AFX_COMDAT const AFX_DATADEF CRuntimeClass nesting_class::class_name::class##class_name = { \
		#class_name, sizeof(class nesting_class::class_name), wSchema, pfnNew, \
			&nesting_class::class_name::_GetBaseClass, NULL }; \
	IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)



#else
#define IMPLEMENT_RUNTIMECLASS_NESTED(nesting_class, class_name, base_class_name, wSchema, pfnNew) \
	AFX_COMDAT const AFX_DATADEF CRuntimeClass nesting_class::class_name::class##class_name = { \
		#class_name, sizeof(class nesting_class::class_name), wSchema, pfnNew, \
			RUNTIME_CLASS(base_class_name), NULL }; \
	IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)



#endif

#define IMPLEMENT_DYNAMIC_NESTED(nesting_class, class_name, base_class_name) \
	IMPLEMENT_RUNTIMECLASS_NESTED(nesting_class, class_name, base_class_name, 0xFFFF, NULL)




----------------  사용하는 방법 예제 ----------------



A.h

class CA : public CObject
{
public:
	DECLARE_DYNAMIC(CA)

	CA(){}
	virtual ~CA(){}
	
	
	
private:
	class CANested : public CObject
	{
	public:
		DECLARE_DYNAMIC(CANested)
		CANested() {}
		virtual ~CANested() {}
		
		
	};

};






A.cpp

IMPLEMENT_DYNAMIC(CA, CObject)
IMPLEMENT_DYNAMIC_NESTED(CA, CANested, CObject)




"로딩" 움직이는 GIF 모음.


구글링하다가 우연히 발견한 Loading 이미지 모음입니다.

제작자가 무료로 오픈한다고 합니다.

많이 이용하세요.


아래 사이트로 가셔서 다운로드 하세요.

http://www.iconmonsters.com/icon-packs/internet-web/loading-animated-gif


혹시 사이트 다운시 혹은 글이 없어진 경우....

loading-animated-gif.rar






출처 : http://www.iconmonsters.com/icon-packs/internet-web/loading-animated-gif


프로그램 실행중에 화면보호기와 같이 모니터 꺼짐 현상 방지하기위해 사용할 함수의 함수 원형.

EXECUTION_STATE WINAPI SetThreadExecutionState(
  _In_  EXECUTION_STATE esFlags
);



	// 함수 포인터를 이용하기 위해 typedef로 타입 정의
	typedef UINT (CALLBACK* PFNDLL_STES)(UINT);

	// 프로그램 실행중에 화면보호기와 같이 모니터 꺼짐 현상 방지.
	PFNDLL_STES pfn;
	pfn = (PFNDLL_STES) GetProcAddress( GetModuleHandle(TEXT(_T("kernel32.dll"))), _T("SetThreadExecutionState"));
	if ( pfn )
	{
		pfn(ES_CONTINUOUS | ES_DISPLAY_REQUIRED);
	}


	// .....................................
	// .....................................
	// .....................................


	PFNDLL_STES pfn;
	pfn = (PFNDLL_STES) GetProcAddress( GetModuleHandle(TEXT(_T("kernel32.dll"))), _T("SetThreadExecutionState"));
	if ( pfn )
	{
		pfn(ES_CONTINUOUS);
	}







출처 : http://blog.naver.com/dulee71/40162300020 에서 퍼옴..

[원격 PC 준비 사항]

1. msvsmon.exe 설치 및 실행

-. 파일 위치 : C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Remote Debugger\x86 or x64

-. 실행시 방화벽 해제 

  DCOM : TCP 135 

  IPSEC : UDP 4500, 500

-. 도구의 옵션에서 Windows 인증 선택

-. 도구의 권한에서 로컬 사용자를 디버그 허용 체크

 

2. 디버깅 프로그램을 실행파일과 디버깅 정보 파일(.pdb)을 같이 복사.

 

[로컬 PC 준비 사항]

1. 원격 계정과 같은 아이디와 패스워드로 로그인(.NET 환경 디버깅일 경우 필수)

2. VS 2010 방화벽 설정

-. 제어판 > Windows 방화벽 > Windows 방화벽에서 프로그램 허용

-. VS2010 허용 설정(홈/회사, 공용 네트워크 모두 체크)

3. VS2010 환경설정

-. 프로젝트 속성 > 디버그 탭 > 시작 외부 프로그램에 디버깅 대상 프로그램의 Full Path 입력.

(원격 PC의 "C:\Develop\Test\Test.exe" 라면 "C:\Develop\Test\Test.exe" 그대로 입력)

-. 원격 컴퓨터 사용 체크 및 컴퓨터 이름 입력.

(원격 컴퓨터 이름 찾기 ==> 원격에 실행된 msvsmon.exe의 도구 > 옵션 > 서버이름)

4. 디버그 시작(^^).

 

@ 2012.09.20 추가 ====================

-. 도메인 가입된 원격 컴퓨터도 디버깅 가능함.

-. 혹시 "워크스테이션과 주 도메인 사이의 트러스트 관계에 이상이 있습니다 " 라는 문구가 나타날 경우 도메인 해제 후 다시 도메인을 가입해 볼 것.

http://answers.microsoft.com/ko-kr/windows/forum/windows_7-security/%EC%9C%88%EB%8F%84%EC%9A%B0/121ca17f-7a01-41ff-ba74-381e9d74d5a4?msgId=fd4ec497-b364-405e-80e6-69daf13902da )

@ 2012.10.16 추가 ====================

-. 웬만하면 msvsmon.exe는 관리자 권한으로 실행하자.

( 권한 관련 문제로 삽질하는 경우가 있다. ㅠㅠ )

@ 2012.12.10 추가 ====================

-. 혹시 로컬에서는 잘 되는데 원격 디버깅시 "서비스 종점의 연결 실패. allowAccess 권한 설정" 같은 에러가 발생할 경우.

원격 컴퓨터의 로컬 보안정책 수정 필요.

(로컬 보안 정책 > 로컬 정책 > 보안 옵션 > 사용자 계정 컨트롤 : 관리 승은 모드에서 모든 관리자 실행

==> "사용 안함 "으로 설정 후 원격 컴퓨터 재부팅) 

 

출처 : http://blog.naver.com/dulee71/40162300020 에서 퍼옴..

아직 테스트는 안해 봤음..


자바스크립트를 포함하여 C, C++, Java, Cobol, Fortran등등의 프로그래밍 언어의 소스코드를 자동으로 정리해 주는 프로그램이 있어 소개합니다.

이름은 바로 UniversalIndentGUI 입니다.

사용하기 쉽게 GUI로 되어있으며 사용 방법도 무지 직관적입니다.

그냥 코드 Load하고 Live Indent Preview를 수행하기만 하면 됩니다.

다음 이미지를 참고하세요.





아래 링크 클릭해서 다운 받으세요.

정리만 전문으로 하는 콘솔 프로그램 : http://sourceforge.net/projects/uncrustify/support?source=navbar

제가 소개한 GUI까지 같이 있는 UniversalIndentGUI : http://universalindent.sourceforge.net/




uses Windows, SysUtils, Forms, Variants, ComObj, OleServer;

...

...

...


function GetExcelText(fName: String): String;

var

  Excel: OleVariant;

  i, j: Integer;

  tmpString: String;


begin

  Result:='';


  // 엑셀 어플리케이션 생성

  try

    Excel:=CreateOleObject('Excel.application');

  except

    MessageBox(0,'Excel이 설치되어 있지 않습니다.','',MB_OK);

    Exit;

  end;


  // 파일이 있는지 확인

  if not FileExists(fName) then begin

    MessageBox(0,'파일이 없습니다','',MB_OK);

    Exit;

  end;


  // WorkBooks Open

  Excel.Workbooks.Open(fName);


  // Cell 의 내용을 받아옴

  for i:=1 to Excel.ActiveSheet.UsedRange.Rows.Count do begin

    for j:=1 to Excel.ActiveSheet.UsedRange.Columns.Count do begin

      tmpString:=Excel.Cells[i, j];

      if Length(Trim(tmpString))>0 then Result:=Result+#13#10+tmpString;


      Application.ProcessMessages;

    end;

  end;


  // 해제과정

  Excel.Workbooks.Close;

  Excel.Quit;

  Excel:=Unassigned;

end;

Delphi XE 버전을 자주 사용하는데 편리한 Auto Complete 기능이 떄론 불편할 때도 있다.

Auto Complete 중에서도 불편한 Auto Complete 기능을 사용 않도록 설정한다.




나는 위와 같이 for 하나만 썼는데 알아서 Low 와 High까지 기록해 주는 친절은 그리 반갑지 않다.

그래서 아래와 같이 Auto Complete를 사용 안함을 뜻하는 Uncheck를 실시한다.



그리고 소스 편집기에서 for 문을 입력해 본다.



내가 원하는 대로 나머지 군더더기들은 없어졌다.




ATL 관련 헤더를 사용할 때 GUID_NULL 에러가 발생한다.


이때는 atl*.h 들 앞에 cguid.h 를 선언해 주면 된다.



#include <CGuid.h>
#include <atl____.h>






http://mycplusplusexperience.blogspot.com/2009/10/error-c2065-guidnull-undeclared.html





X86용 VS2010설정 파일

Exported-2013-03-22.vssettings









Win7 X64에서 사용하는 VS2010설정 파일

Exported-2013-12-26.vssettings










Win7 X86 32비트에서 사용하는 VC6 설정 레지스트리 파일

win7x86_vc6_setting_registry.reg






Win7 X64 64비트에서 사용하는 VC6 설정 레지스트리 파일

vc6_x64_setting_registry.reg










.h 파일과 .cpp 파일을 상호 왔다 갔다 할 수 있는 매크로와 문자열에 _T()를 자동으로 추가해 주는 매크로

VS2010 매크로 파일(h,cpp 이동 _T자동삽입).7z



VC6용 .h/.cpp 왔다 갔다 매크로 + 주석 처리 매크로

mymacro3.dsm



프로그래밍하기 좋은 Consolas 폰트

consolas_font_setup.exe


+ Recent posts