프로그래밍/C/C++2018. 3. 6. 11:05

부록 G. 도스(DOS) 배치 파일을 쉘 스크립트로 변환

아주 많은 프로그래머들은 PC 위에서 도는 도스에서 스크립트를 배웠습니다. 기능이 조금 떨어지는 도스 배치 파일 언어로도 꽤 강력한 스크립트나 어플리케이션을 작성할 수도 있지만 그렇게 하려면 아주 해박한 지식을 사용해 해결책을 찾거나 꽁수를 부려야 합니다. 가끔은 오래된 도스용 배치 파일을 유닉스 쉘 스크립트로 변환해서 써야될 경우가 생기지만 이렇게 하는것이 그렇게 어렵지만은 않습니다. 왜냐하면 도스 배치 파일 연산자들이 기능이 동일한 쉘 스크립트 연산자의 서브셋에 불과하기 때문입니다.

표 G-1. 배치 파일 키워드/변수/연산자 와 그에 해당하는 쉘 동의어

배치 파일 연산자쉘 스크립트 동의어
%$명령어줄 매개변수 접두사
/-명령어 옵션 플래그
\/디렉토리 패스 구분자
===(같음) 문자열 비교 테스트
!==!!=(다름) 문자열 비교 테스트
||파이프
@set +v현재 명령어를 에코하지 말 것
**파일명 "와일드 카드"
>>파일 재지향(덮어 쓰기)
>>>>파일 재지향(덧붙여 쓰기)
<<표준입력 재지향
%VAR%$VAR환경 변수
REM#주석
NOT!뒤에 나오는 테스트 부정
NUL/dev/null명령어 출력을 없애기 위한 "블랙홀"
ECHOecho에코 (Bash 에는 옵션이 많이 있음)
ECHO.echo빈 줄 에코
ECHO OFFset +v다음에 나오는 명령어를 에코하지 말 것
FOR %%VAR IN (LIST) DOfor var in [list]; do"for" 루프
:LABEL없음 (필요치 않음)라벨
GOTO없음 (대신 함수를 씀)스크립트의 다른 곳으로 건너 뜀
PAUSEsleep일정 간격을 두고 잠시 대기
CHOICEcase 나 select메뉴 선택
IFifif-test
IF EXIST FILENAMEif [ -e filename ]파일이 존재하는지 확인
IF !%N==!if [ -z "$N" ]변경가능한 매개변수인 "N"이 없다면
CALLsource 나 . (도트 연산자)다른 스크립트를 "포함"
COMMAND /Csource 나 . (도트 연산자)다른 스크립트를 "포함"(CALL과 동일)
SETexport환경 변수를 세트
SHIFTshift명령어줄 변수 목록을 왼쪽으로 이동(shift)
SGN-lt or -gt(정수) 부호(sign)
ERRORLEVEL$?종료 상태
CONstdin"콘솔"(표준입력)
PRN/dev/lp0(일반적인) 프린터 디바이스
LP1/dev/lp0첫번째 프린터 디바이스
COM1/dev/ttyS0첫번째 시리얼 포트

배치 파일은 대개 도스 명령어를 갖고 있습니다. 도스용 배치 파일이 쉘 스크립트로 변환되기 위해서는 이 명령어들은 꼭 동일한 유닉스 명령어로 변환되어야 합니다.

표 G-2. 도스 명령어와 동일한 유닉스 명령어

도스 명령어동일한 유닉스 명령어효과
ASSIGNln파일이나 디렉토리를 링크
ATTRIBchmod파일 퍼미션 변경
CDcd디렉토리 변경
CHDIRcd디렉토리 변경
CLSclear스크린 지우기
COMPcmp or diff파일 비교
COPYcp파일 복사
Ctl-CCtl-C정지(시그널)
Ctl-ZCtl-DEOF (end-of-file)
DELrm파일 삭제
DELTREErm -rf디렉토리의 하위 디렉토리까지 포함해서 삭제
DIRls -l디렉토리 보이기
ERASErm파일 삭제
EXITexit현재 프로세스 종료
FCcomm, cmp파일 비교
FINDgrep파일안에서 문자열 찾기
MDmkdir디렉토리 생성
MKDIRmkdir디렉토리 생성
MOREmore텍스트 파일 쪽단위(paging) 필터
MOVEmv이동
PATH$PATH실행파일들의 경로
RENmv이름 바꾸기(이동)
RENAMEmv이름 바꾸기(이동)
RDrmdir디렉토리 삭제
RMDIRrmdir디렉토리 삭제
SORTsort파일 정렬
TIMEdate시스템 시간 보여주기
TYPEcat파일을 표준출력으로 출력
XCOPYcp(확장) 파일 복사

참고: 사실 모든 유닉스, 쉘 연산자, 명령어들은 그들과 동일한 도스용보다 많은 옵션과 강력한 기능을 갖고 있습니다. 많은 배치 파일 스크립트들은 read의 불완전한 버전인 ask.com같은 외부 유틸리티에 의존합니다.

도스는 파일명 와일드 카드 확장에 대해서 오직 *과 ? 문자만을 인식하는 제한되고 부족한 서브셋을 지원합니다.

도스 배치 파일을 쉘 스크립트로 변환하는 것은 일반적으로 매우 간단하고 가끔은 변환된 쉘 스크립트가 원래 도스 배치 파일보다 더 이해하기 쉬운 경우도 있습니다.

예 G-1. VIEWDATA.BAT: 도스용 배치 파일

REM VIEWDATA

REM PAUL SOMERSON의 "DOS POWERTOOLS"의 예제에서 영감을 받아 작성


@ECHO OFF

IF !%1==! GOTO VIEWDATA
REM  명령어줄 인자가 없다면...
FIND "%1" C:\BOZO\BOOKLIST.TXT
GOTO EXIT0
REM  문자열이 일치하는 줄을 출력후 종료.

:VIEWDATA
TYPE C:\BOZO\BOOKLIST.TXT | MORE
REM  한 번에 한 쪽씩 전체 파일을 보여줌.

:EXIT0

스크립트 변환을 하면 기능이 다소 개량됩니다.

예 G-2. viewdata.sh: VIEWDATA.BAT 의 스크립트 버전

#!/bin/bash
# VIEWDATA.BAT 를 쉘 스크립트로 변환.

DATAFILE=/home/bozo/datafiles/book-collection.data
ARGNO=1

# @ECHO OFF       여기서 이 명령어는 필요없습니다.

if [ $# -lt "$ARGNO" ]    # IF !%1==! GOTO VIEWDATA
then
  less $DATAFILE          # TYPE C:\MYDIR\BOOKLIST.TXT | MORE
else
  grep "$1" $DATAFILE     # FIND "%1" C:\MYDIR\BOOKLIST.TXT
fi  

exit 0                    # :EXIT0

# GOTO, 라벨, 속임수, 엉터리 구문등이 필요없어졌죠.
# 원래 배치 파일보다 더 짧고, 더 쉽고, 더 깔끔합니다.



참고 : http://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/dosbatch.html

Posted by 컴투
프로그래밍/C/C++2013. 8. 13. 14:13

내가 만드는 프로그램을 항상 하나만 실행하도록 하려면 어떻게 해야 하나 ? 그리고 두 번째 실행시에는 먼저 실행되어 있던 프로그램을 앞으로 띄우고 싶다.

만일 프로그램의 캡션이 고정되어 있다든가 사용되는 윈도우의 클래스 이름을 알고 있다면 FindWindow 혹은 FindWindowEx를 사용하면 아주 손쉽게 문제를 해결할 수 있다. 하지만 윈도우의 캡션이 계속적으로 변한다든지 윈도우 클래스 이름을 모르는 경우에는 이것으로 해결책이 되지 못한다. MFC를 사용할 경우가 대표적인데 윈도우 클래스의 이름을 MFC 내부에서 만들어 사용하기 때문에 윈도우 클래스를 직접 등록하여 사용하는 고난도의 기술을 사용하기 이전에는 윈도우 클래스의 이름을 알 수가 없다. 해결책에는 여러 가지 방법이 있겠지만 파일 맵핑 객체를 이용하도록 하겠다. 원래 파일 맵핑 객체의 목적은 여러 프로세스간에 데이터를 주고 받기 위해 사용되며 사용 방식 자체는 기존의 동적 메모리 할당 방식과 흡사하다.
간단히 절차를 설명하면 다음과 같다. 처음 뜨는 프로그램이 정해진 이름의 파일 맵핑 객체(여기서는 이름은 My TestMap)를 만들어 놓는다. 그리고 나서 자신의 메인 윈도우의 핸들을 그 객체에 기록해 놓는다. 이 때 다시 그 프로그램을 실행시키면 이 이름의 파일 맵핑 객체가 있는지 살펴보고 있으면 실행을 중지한다. 그리고 파일 맵핑 객체에 기록되어 있는 윈도우의 핸들값을 읽어서 앞으로 띄워 버린다. 이것이 가능한 이유는 파일 맵핑 객체는 시스템 전역 객체이기 때문이다. 즉 한 프로세스에서 만들어도 다른 프로세스에서 접근할 수 있다. 먼저 항상 하나만 떠 있게 하는 방법을 알아보고 다음으로 기존의 프로그램을 앞으로 띄우는 코드를 알아보도록 하겠다. 사실 아래의 코드를 이해하려면 파일 맵핑 객체에 대해 알아야 하는데 그것 자체에 대한 설명은 생략하기로 하겠다.

항상 하나만 떠 있게 하는 방법
다음 코드를 애플리케이션 클래스의 InitInstance의 선두에 넣는다. 파일 맵핑 객체의 크기를 4바이트로 잡은 이유는 윈도우 핸들이 UINT이고 그 크기가 4바이트이기 때문이다. CreateFileMapping API는 파일 맵핑 객체를 생성할 때 사용되는데, 이름과 크기를 줄 수 있다. 이미 존재하는 이름으로 파일 맵핑 객체를 생성하려고 하면 GetLast Error라는 API를 호출했을 때 ERROR_ALREADY_ EXISTS라는 에러 코드가 리턴된다. 이것으로 먼저 실행된 프로그램이 있는지 알아낼 수 있다.

HANDLE hMapping;

// MyTestMap이란 이름으로 4바이트의 영역을 잡는다
hMapping = CreateFileMapping( (HANDLE) 0xffffffff, NULL,
PAGE_READWRITE, 0, 4, “MyTestMap” );
if (hMapping)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
// 같은 이름의 파일 맵핑 객체가 존재
{
// 프로그램이 이미 실행중임을 알리는 메시지를 띄운다.
MessageBox( NULL, “이미 실행 중입니다.”, “경고”, MB_OK );
return FALSE;
}
}
위의 코드는 하나의 실행파일을 실행할 수 있는 방법이지만 기존에 실행되어 있는 프로그램을 앞으로 띄우는 일까지 할 수는 없다. 그렇게 하고 싶다면 InitInstance의 코드의 끝 부분에 메인 윈도우의 핸들을 파일 맵핑 객체에 저장하는 코드를 추가한다. 아래의 예는 SDI(Single Document Interface) 혹은 MDI(Multiple Document Interface)형식의 프로젝트인 경우의 예이다. 만일 다이얼로그 기반의 프로젝트라면 아래의 코드는 메인 다이얼로그 클래스의 WM_CREATE 메시지나 OnInitDialog 함수에 추가되어야 한다. CreateFileMapping으로 생성된 파일 맵핑 객체는 MapViewOfFile이란 API를 통해 메모리 포인터로 변환할 수 있다. 즉 할당된 파일 맵핑 객체를 접근할 수 있는 메모리 포인터를 사용해 내용을 읽고 쓰고 할 수 있다.

LPDWORD lpDword;

// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// ---------------------------------
// 이번에는 파일 맵핑 객체를 쓰기 모드로 오픈한다.
lpDword=(LPDWORD)MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 4);
// 메인 윈도우의 핸들을 저장한다.
*lpDword = (DWORD)m_pMainWnd->m_hWnd;
UnmapViewOfFile(lpDword);
// ---------------------------------
m_pMainWnd->ShowWindow(SW_SHOW);
그러면 앞서 살펴보았던 두 번째로 뜨는 프로그램인지 체크하는 코드 부분을 보강해 보자. 두 번째 뜨는 프로그램일 경우에 원래 먼저 떴던 프로그램의 메인 윈도우를 앞으로 내세우는 코드를 추가해 보자.

hMapping = CreateFileMapping( (HANDLE) 0xffffffff, NULL,
PAGE_READWRITE, 0, 32, “MyTestMap” );
if (hMapping)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
// 같은 이름의 파일 맵핑 객체가 존재
{
// 프로그램이 이미 실행 중임을 알리는 메시지를 띄운다.
MessageBox( NULL, “이미 실행 중입니다.”, “경고”, MB_OK );

// 기존 파일 맵핑 객체를 연다. 기존 파일 맵핑 객체의 선두에 이전 프로그램
// 의 메인 윈도우 핸들이 들어있다. 뒷부분의 코드를 보면 알 것이다.
LPDWORD lpDword;
HWND hWnd;
// 파일 맵핑 객체를 읽기 모드로 오픈한다.
hMapping = OpenFileMapping(FILE_MAP_READ, FALSE,
“MyTestMap”);
// 파일 맵핑 객체 핸들로부터 포인터를 얻어낸다.
lpDword = (LPDWORD)MapViewOfFile(hMapping,
FILE_MAP_READ, 0, 0, 4);
// 저장되어 있던 윈도우 핸들을 얻어낸다.
hWnd = (HWND)*lpDword;

// 윈도우를 전면으로 내세우기 전에 먼저 아이콘 상태에 있을지도 모르는
// 윈도우를 원래 크기로 되돌린다. IsIconic 함수를 호출하여 아이콘 상태
// 여부를 확인해도 될 것이다.
ShowWindow(hWnd, SW_SHOW);
// 윈도우를 전면으로 내세운다.
SetForegroundWindow(hWnd);
// 파일 맵핑 객체를 닫는다.
UnmapViewOfFile(lpDword);
return FALSE;
}
위의 코드에서 윈도우를 전면으로 내세우는데 SetFore groundWindow라는 함수를 사용한다는 것을 기억해 두기 바란다. 이 함수의 인자로는 반드시 메인 윈도우의 핸들을 지정해야 한다. 지금까지 살펴보았던 코드를 다시 전체적으로 정리하면 다음과 같다.

HANDLE hMapping;

hMapping = CreateFileMapping( (HANDLE) 0xffffffff, NULL,
PAGE_READWRITE, 0, 32, “MyTestMap” );
if (hMapping)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
// 같은 이름의 파일 맵핑 객체가 존재
{
// 프로그램이 이미 실행 중임을 알리는 메시지를 띄운다.
MessageBox( NULL, “이미 실행 중입니다.”, “경고”, MB_OK );

// 기존 파일 맵핑 객체를 연다. 기존 파일 맵핑 객체의 선두에 이전 프로그램의
// 메인 윈도우 핸들이 들어있다. 뒷부분의 코드를 보면 알 것이다.
LPDWORD lpDword;
HWND hWnd;
// 파일 맵핑 객체를 읽기 모드로 오픈한다.
hMapping = OpenFileMapping(FILE_MAP_READ, FALSE,
“MyTestMap”);
// 파일 맵핑 객체 핸들로부터 포인터를 얻어낸다.
lpDword = (LPDWORD)MapViewOfFile(hMapping,
FILE_MAP_READ, 0, 0, 4);
// 저장되어 있던 윈도우 핸들을 얻어낸다.
hWnd = (HWND)*lpDword;

// 윈도우를 전면으로 내세우기 전에 먼저 아이콘 상태에 있을지도 모르는
// 윈도우를 원래 크기로 되돌린다. IsIconic 함수를 호출하여 아이콘
// 상태 여부를 확인해도 될 것이다.
ShowWindow(hWnd, SW_SHOW);
// 윈도우를 전면으로 내세운다.
SetForegroundWindow(hWnd);
// 파일 맵핑 객체를 닫는다.
UnmapViewOfFile(lpDword);

return FALSE;
}
// 이 뒤부터 ------ 까지는 원래 InitInstance 코드
.....
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// --------------
// 다음을 추가한다.
LPDWORD lpDword;

lpDword = (LPDWORD)MapViewOfFile(hMapping, FILE_MAP_WRITE,
0, 0, 4);
*lpDword = (DWORD)m_pMainWnd->m_hWnd;
UnmapViewOfFile(lpDword);
// 이 뒤로는 다시 원래 InitInstance의 코드
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();



출처 : www.codeland.co.kr

[펌]http://snslab.kangwon.ac.kr/home/?bo_table=openclass&doc=bbs/gnuboard.php&wr_id=132

Posted by 컴투
프로그래밍/C/C++2013. 7. 10. 08:59

원래 thread 함수 내부에서는 Updatedata를 사용할 수 없다.
하지만 Dlg클래스에 사용자 메시지를 등록하여
thread 함수에서 이에 접근하는 방법으로 사용가능하다.

 

1. 다음과 같이 Dialog class에 멤버함수로 UpdateData를 실행하는 함수를 만들어 준다.

LRESULT ___Dlg::OnUpdateDataFalse(WPARAM wParam, LPARAM lParam)
{
     return UpdateData(FALSE);
}


LRESULT ___Dlg::OnUpdateDataTrue(WPARAM wParam, LPARAM lParam)
{
     return UpdateData(TRUE);
}

 


2. stdafx.h 에 사용할 사용자 정의 메시지를 정의한다.

//사용자 정의 메시지
#define UM_UPDATEDATAFALSE (WM_USER+1)  //thread 에서 updatedata를 사용하기 위한 사용자 message
#define UM_UPDATEDATATRUE (WM_USER+2)

 

3. ___Dlg.cpp 의
   BEGIN_MESSAGE_MAP 에
   정의한 사용자 메시지를 등록해 준다.

BEGIN_MESSAGE_MAP(.......(생략) )
.......(생략)
 ON_MESSAGE(UM_UPDATEDATAFALSE, OnUpdateDataFalse) //thread 에서 updatedata 를 사용하기 위한 사용자메시지 처리
 ON_MESSAGE(UM_UPDATEDATATRUE, OnUpdateDataTrue)  //thread 에서 updatedata 를 사용하기 위한 사용자메시지 처리

END_MESSAGE_MAP()

 

4. thread를 시작할 때 현재 Dialog의 핸들을 인수로 넘겨주면서 시작한다.
   (-> 작업자 thread 함수는 전역 함수이므로(dialog의 멤버 함수가 아님))
   (-> Dialog class 의 멤버들을 사용할 수 있게 하기 위함.)

  AfxBeginThread(thread작업함수이름,this);

 

5. thread작업함수 에서 dialog class 의 멤버들을 가져다 쓰기위한 pointer 를 선언/할당 한다.

UINT ThreadDataSave(LPVOID pParam)
{
   ___Dlg* pDlg = (___Dlg*)pParam;

   ...(생략)
}

 

6. thread 에서 dialog class의 메시지에 접근하여 updatedata 를 실행한다.

UINT ThreadDataSave(LPVOID pParam)
{
   ___Dlg* pDlg = (___Dlg*)pParam;

   ...(생략)
   pDlg->PostMessage(UM_UPDATEDATAFALSE);
   pDlg->PostMessage(UM_UPDATEDATATURE);
}

출처 : http://bluebearworld.tistory.com/147

Posted by 컴투
프로그래밍/C/C++2013. 5. 30. 15:42

LINK : fatal error LNK1104: 'LIBC.lib' 파일을 열 수 없습니다.



코딩중에 갑자기 처음보는 에러가 나와서 당황했다.

해당 오류의 원인은 Visual Studio가 이제 더이상 단일쓰레드를 지원하지 않아서 라고 한다.

그럼 해결방법은 어떻게 되는것인가?


해당 라이브러리를 무시하면 된다고 한다.


프로젝트 -> 프로젝트 속성 -> 구성 속성 -> 링커 ->입력 까지 들어가면 

특정 라이브러리 무시 칸이있다 여기에 

libc.lib; 를 쓰고 확인을 누른다.




이렇게 해당 속성을 건드려 준뒤에 빌드를 하니

성공메시지가 떴다.

 

[출처] http://stackov.tistory.com/2

Posted by 컴투
프로그래밍/C/C++2013. 3. 27. 10:17

MFC에서 보통 AfxMessageBox를 이용해서 팝업 메시지를 띄우면

exe파일의 이름을 타이틀로 사용합니다.

PopupTest.exe라는 파일에서 AfxMessageBox를 사용하면 다음과 같이 나옵니다.

AfxMessageBox(_T("Test!!!"));

PopupTest라는 타이틀로 화면에 표시가 됩니다.

이것을 변경하는 방법이 몇가지 존재합니다.

1. exe 파일명 변경

가장 간단한 방법은 exe 파일을 변경하는 방법입니다.

이 방법은 간단하지만 exe 파일을 변경할 수 없을 때는 사용할 수 없습니다.

2. Resource의 String Table에 AFX_IDS_APP_TITLE을 추가

간단하게 String Table에 AFX_IDS_APP_TITLE이라는 ID를 추가하고

문자열을 입력하면 해당 타이틀을 사용하게 됩니다.

3. CWinApp의 생성자에 NULL 종료 문자열을 전달

프로젝트를 생성하면 프로젝트명과 동일한 cpp와 h 파일이 생깁니다.

PopupTest라는 프로젝트를 생성하고 PopupTest.h 파일을 확인하시면

다음과 같이 CPopupTestApp이 CWinApp을 상속받았다는 것이 확인 가능합니다.

F12를 눌러서 실제 CWinApp 클래스의 모양을 살펴보면

위와 같이 CWinApp은 lpszAppName이라는 인자를 하나 갖는 생성자가 있습니다.

기본값으로 NULL이 되어 있습니다.

PopupTest.cpp 파일로 가서 이 생성자 부분에서

명시적으로 NULL 종료 문자열을 넣어서 CWinApp의 생성자를 호출해주면 됩니다.

이렇게 하면 타이틀을 변경할 수 있습니다.

4. CWinApp의 m_pszAppName 직접 수정

m_pszAppName이 바로 AppName 정보를 갖고 있는 CWinApp의 멤버 변수입니다.

이 값을 직접 바꿔주면 되는데, 그냥 바꾸면 종료될 때 에러가 발생할 수 있습니다.

m_pszAppName = _T("My Title");

이런 식으로 바꾸게 되면 나중에 Heap이 깨졌다는 에러를 보게 될 것입니다.

이유는 m_pszAppName은 malloc으로 할당된 메모리를 참조하고 있고

종료될 때, 소멸자에서 free(m_pszAppName)을 하기 때문입니다.

바꾸기 위해서는 다음과 같이 해줘야 합니다.

InitInstance()같은 곳에 다음 코드를 추가해주면 됩니다.

free((void*)m_pszAppName);
m_pszAppName = _tcsdup(_T("My Title"));

_tcsdup() 함수가 내부적으로 malloc으로 메모리를 할당하고 문자열을 복사한 다음에

주소를 리턴하기 때문에 이렇게 변경하면

CWinApp의 소멸자에서는 해당 주소를 갖고 free를 하게 됩니다.

위와 같은 방법 중에서 하나를 선택해서 AppName을 변경하면

AfxMessageBox의 타이틀을 변경할 수 있습니다.

추가로 Dialog 등에서 한시적으로 변경하기 위해서는 다음과 같이 하면 됩니다.

LPCTSTR pAppNameTemp = AfxGetApp()->m_pszAppName;
AfxGetApp()->m_pszAppName = _T("My Temporary Title");

AfxMessageBox(_T("Test!!!"));

AfxGetApp()->m_pszAppName = pAppNameTemp;

주소를 백업해둔 다음에 임시적으로 바꾸고 다시 원래데로 주소값을 변경해주면 됩니다.

Posted by 컴투
프로그래밍/C/C++2013. 3. 20. 11:15

Visual Studio 테마 변경하기

Visual Studio에서는 기본적으로 흰색 배경에 검은색 글자로 구성되어 있는데요. 하지만 이것들은 여러가지 색삭으로 변경 할 수 있습니다.

아래의 주소에서 여러가지 스타일을 미리 보여줍니다 ( 다운로드 횟수나 View한 횟수도 모두 나오기 때문에 참고 하시기 바랍니다. )

주소 : http://studiostyl.es/schemes

이 홈페이지에서는 Visual Studio version에 맞는 파일을 각각 제공하기 때문에 자신의 Visual Studio version에 맞는 파일을 다운 로드 하시기 바랍니다. 마음에 드는 테마를 받고 Visual Studio를 실행합니다.

스타일의 적용 전의 화면 입니다.

스타일을 받으셧으면 이제 적용을 하셔야 겠죠?

스타일을 적용하려면 메뉴바에서 도구(T) - > 설정 가져오기 및 내보내기(I) 를 클릭합니다.

선택한 환경 설정 가지오기를 체크하신후 다음버튼을 클릭합니다.

- 아니요 , 새 설정을 가져와 현재 설정을 덮어씁니다(O). 를 선택한다음 다음버튼을 클릭합니다.

- [찾아보기] 버튼을 이용하여 이전에 다운받은 설정 파일을 선택한 후에 다음 버튼을 클릭합니다.

완성입니다. 각자 자기에게 맞는 배경으로 잘 사용하셧으면 좋겠습니다.

받으신 배경에서 자신이 더 변경하고 싶다고 하시면 Visual Studio의 도구 -> 옵션 -> 환경 -> 글꼴 및 색 에서 변경하시면 됩니다.

 

[펌] http://mafa.tistory.com/entry/Visual-Studio-테마-변경하기

Posted by 컴투
프로그래밍/C/C++2011. 4. 5. 17:28

C/C++에서 #으로 시작하는 것은 지시어로써 컴파일러에게 무언가를  알릴 때 사용한다.
대표적인 것이 #include로 컴파일러에게 특정  파일을 포힘시키라고 알리는 역할을 한다.
#ifndef (#ifdef)#endif는 항상 함께 사용되며, 사용법은 다음과 같다.
#ifndef(#ifdef) 이름
        내용
#endif

#ifndef는 이름에 해당하는 것이
#define문에 의해 정의되어 있지 않으면 컴파일할 때 내용을 포함시키고,
이름이 정의되어 있으면 포함시키지 말라고 컴파일러에게 지시한다.
#ifdef 는 #ifndef와 반대로 동작한다. 정의되어 있을 때 포함시킨다.

ex)
#ifndef __CMACHINE_H_INCLUDED__
#define __CMACHINE_H_INCLUDED__
프로그램 내용
#endif

__CMACHINE_H_INCLUDED__이 정의안된 상태라면
그것을 디파인하고 프로그램내용도 사용한다.

[출처]http://duhwani.byus.net/

Posted by 컴투