프로그래밍/기타...2018. 3. 7. 09:45

참고 : https://blog.naver.com/powerms100/120008462157


자세한 설정내용은 위 블로그를 참고하셔도 좋습니다.


==========================================================================================

rem oracle backup 

@echo off

SET ORACLE_SID=ORAGEO

SET MONTH=%date:~5,2%

SET YEAR=%date:~0,4%

for %%a in (%date%) do SET day=%%a

md D:\DB백업\%YEAR%\%MONTH%\dmp

md D:\DB백업\%YEAR%\%MONTH%\log

C:\oracle\product\10.2.0\db_1\BIN\EXP 아이디/비번 file=D:\DB백업\%YEAR%\%MONTH%\dmp\%DAY%.dmp log=D:\DB백업\%YEAR%\%MONTH%\log\%DAY%backuplog.txt

rem 매일 새벽 5시에 export 받는 작업 예약하기

rem C:\> at 05:00 /every:Su,M,T,W,Th,F,S D:\bak\bat\oracle_exp.bat

==========================================================================================

사실 위와같은 내용으로 사용중에 오라클DB백업을 사용중에 있는것을 확인하였는데, 

인터넷을 검색하니 위 내용으로 예시가 올라와 있더라구요ㅎ 

배치파일은 위 내용을 포함하는 .bat 파일을 만들어 주면 됩니다. 

위 내용을 만들어진 만들어진 .bat 파일을 스케줄러에 등록해야하는데요 아래와 같이 등록을 합니다.


1. 윈도우 -> 실행 , 사진과같이 검색하여 '작업 스케줄러'를 살행




2. 실행 된 작업 스케줄러 '작업 스케줄러 라이브러리' 에 오른버튼을 이용하여 '작업만들기' 실행




3. '새 작업 만들기' 창이 뜨면 이름에 설정하고자 하는 내용을 기록



4.  트리커 탭에서 '새로 만들기' 선택



5. '새 트리가 만들기' 화면이 뜨면 '설정' 부분을 설정한다.

- 한번, 매일, 매주, 매월

- 시작 시간 설정



5. 동작 탭으로 이동하여 '새로 만들기' 선택



6. 실행 된 '새 동작 만들기' 창에서 '설정-찾아보기' 버튼을 이용하여 .bat 파일을 선택하고 '확인버튼' 선택



7. 아래와 같이 스케줄이 등록 된 것을 확인할 수 있다. 




8. 설정 된 시간에 dump 파일이 잘 생성됨을 확인 할 수 있음 . 끝~~~~~


Posted by 컴투
프로그래밍/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 컴투

1. qt.nokia.com/downloads 로 이동하셔서, VS2008용 Qt 라이브러리를 다운받고 설치를 합니다.

 
2. 환경변수를 하기 처럼 설정해주세요.

 
3. MSVC에서 다음 메뉴로 컨맨드를 실행시켜서 프로젝트 파일을 만들수 있습니다.

1) 프로젝트 생성    File > New > Project > General > Makefile Project

2) Project > Properties > Configuration Properties > Nmake로  프로젝트 생성시작
 
3) debug와 release 의 build command 다음 구문입력
   qmake -project && qmake && nmake debug
   qmake -project && qmake && nmake release-all 
    *rebuild와 clear 구문도 여기서 입력이 가능합니다.
4)  Output filed를 다음 처럼 수정
   debug\HelloQt.exe (debug)
   release\HelloQt.exe (release 모드)
5) Hello.cpp 파일이나 그 밖의 파일을 프로젝트에 포함시킨뒤 컴파일 하면 됩니다.
    단, 유저가 만든 pro파일 사용시에는
    위 3)번 항에서 qmake -project && 을 삭제 해주심 됩니다.
 

 위 사항은 다음 두 링크에서 참조했습니다.

http://rajorshi.net/blog/2009/01/using-qt-with-msvc-express-2008

 http://bluenlive.net/334 (한국어, 단, mingw사용)

 

사실 Creator나 이클립스가 VC Express에 비해 더 잘 만든 UI인건 틀림없지만, 여러가지 이유로 VC cl 컴파일러를 어쩔수 없이 사용해야 할 경우가 있죠. 게다가, Creator의 경우 디버깅을 위해서 windbg를 따로 설치 해야 되는데, 설정방법이 좀 까다롭더군요.

 

출처 : http://www.qt-dev.com/board.php?board=tipboard&command=body&no=7

Posted by 컴투

1. 개요
Qt로 윈도우에서 개발하기 위해서는 상용버전의 Qt를 사면 Visual Studio와 연동되는 Qt를 얻을 수 있지만, opensource버전을 이용해서 IDE에서 할 수 있는 방법을 찾아보던중
eclipse와 연동되는 것을 해보았습니다.

2. Eclipse IDE for C/C++ Developers 설치
2.1 JRE설치
eclipse는 java로 만들어 졌기때문에 eclipse를 실행하려면 java runtime이 필요합니다.
다음의 URL에서 다운로드 가능합니다.


2.2 eclipse 설치
먼저 eclipse 공식홈페이지에 가서 Eclipse IDE for C/C++ Developers를 다운로드 받은다음 압축을 해제합니다.
별도의 설치과정이 없기때문에, 압축해제한 파일을 적당한 디렉토리로 이동시켜놓으면 끝입니다.
저의경우에는 c:\Eclipse 디렉토리로 이동시켜 두었습니다.


2.3 Eclipse CDT plug-in 설치
eclipse에서 c/c++개발환경을 위해서는 CDT plugin이 필요합니다.
다음의 위치에서 다운로드를 받아서 압축을 해제하면 plugins, features디렉토리가 생성되는데, 이 두 디렉토리내의 파일을 eclipse의 plugins, features디렉토리로 복사를 합니다.


2.4 mingw설치
Eclipse는 기본적으로 c/c++컴파일러가 없기때문에 mingw의 c/c++컴파일러를 설치합니다.
다음의 URL에 가서 mingw를 받은다음 MinGW-5.1.3.exe를 실행합니다.
여기에서 gcc, g++을 선택하여 설치를 합니다.


설치가 모두 마친다음 eclipse에서 mingw의 컴파일러를 참조하기 위한 PATH를 걸어줍니다.
윈도우 환경변수 PATH에 c:\mingw\bin을 설정합니다.

또한, eclipse에서는 컴파일을 할때 make.exe를 참조하게 되어 있는데, c:\mingw\bin에는 make.exe라는 이름대신에 mingw32-make.exe만 존재합니다.
eclipse환경설정에서 make.exe대신에 mingw32-make.exe로 변경해 주면 되지만
그냥 간편하게 mingw32-make.exe파일을 make.exe라는 이름으로 하나 더 복사합니다.

2.5 이제 eclipse를 실행해서 new project로 c++ application을 하나 만든다음
컴파일 (Ctrl + B) 하고 실행 (Ctrl + F11)을 해봅니다.
아래에 console에 hello, world가 찍히면 성공입니다.
만약 컴파일 에러가 난다면 위의 2.4부분의 환경변수를 확인해 보세요.

3. Qt 설치
3.1 Qt 다운로드
Qt소스는 trolltech홈페이지에서 다운로드 받으실 수 있습니다.


다운로드 받은파일을 적당한 디렉토리에 압축을 해제합니다.
그리고 나서 적당한 이름으로 변경해줍니다. 저의 경우에는 c:\Qt\4.3.2 라는 디렉토리로 위치와 이름을 수정했습니다.(상용버전을 설치하면 이렇게 되거든요)

3.2 Qt 컴파일
Qt를 컴파일 하기 위해 먼저 윈도우 환경변수 PATH에 Qt위치\bin 디렉토리를 설정합니다.
저의 경우 PATH에 c:\Qt\4.3.2\bin이라는 형식으로 추가하였습니다.

이제 시작 -> 실행 -> cmd를 실행해서 dos command창에서 c:\Qt\4.3.2 디렉토리로 이동합니다.
Qt를 Visual Studio .NET 2003컴파일러를 이용해서 컴파일 하기 위해서
"C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat"를 실행합니다.(이때 반드시 "를 붙여야 합니다. 안 그러면 제대로 명령이 안먹습니다.)

C:\Qt\4.3.2>"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\vs
vars32.bat"
Setting environment for using Microsoft Visual Studio .NET 2003 tools.
(If you have another version of Visual Studio or Visual C++ installed and wish
to use its tools from the command line, run vcvars32.bat for that version.)


위와같이 나오면 제대로 실행된것입니다.
이제 configure설정을 합니다.

C:\Qt\4.3.2>configure -platform win32-msvc.net


이것은 qt의 프로젝트파일인 .pro를 생성하기 위한것인데, 조금 오래걸립니다.

위 작업을 모두 마치면 이제 아래와같이 컴파일을 합니다.

C:\Qt\4.3.2>nmake


이것은 엄청나게 오래걸립니다.
컴파일이 완료되면 모두 끝납니다.

3.3 Qt eclipse integration설치
eclipse에서 Qt용 프로젝트 생성 이나 Qt디자인등을 하기 위해서는 trolltech에서 제공하는
Qt Eclipse Integration을 설치하면 됩니다.
다음의 URL에서 다운로드 하면 됩니다.


4. Eclipse 실행
위과정까지 모두 마찬후에 eclipse를 실행하면 Qt를 Visual Studio .NET 2003컴파일러로
컴파일 했기때문에 제대로 컴파일이 안됩니다.
이것은 환경변수가 설정이 안되어 있어서 그런것인데,
설정해 주어야 할 것이 너무 많고해서 저의 경우 다음과 같이 설정을 하였습니다.

먼저 C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\vsvars32.bat파일을 eclipse디렉토리로 복사해서 vsvars32.bat의 아래부분에 eclipse를 실행하는 코드를 넣고 vsvars32.bat를 eclipse_msvc.bat로 변경한다음에 eclipse_msvc.bat로 항상 실행한다.

vsvars32.bat 수정사항

@set LIB=%MSVCDir%\ATLMFC\LIB;%MSVCDir%\LIB;%MSVCDir%\PlatformSDK\lib\prerelease;%MSVCDir%\PlatformSDK\lib;%FrameworkSDKDir%\lib;%LIB%

eclipse <--- 이 부분을 추가함

 

[출처] http://torpedo7.egloos.com/103779 - 이글루속의 앙새나라

'프로그래밍 > QT programming' 카테고리의 다른 글

[펌]VC Express와 Qt의 사용  (0) 2013.04.23
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 컴투

소스인사이트는 강력한 에디터 입니다. 쓰는 분들은 다른에디터로 옮겨가기 어려울 정도?? (개인적인 생각이었습니다.)


이 에디터를 사용해본 사람들은 주석 처리 하는것이 좀 귀찮다는 생각이 들 것입니다.

선택한 영역을 전체 주석 처리 하는 기능이 없기 때문입니다.

그래서 이런 필요한 기능들을 매크로로 정의해서 사용 하는데요 말 나온김에 선택영역 전체를 

주석 처리 하는 매크로 작성법에 대해 알아 보겠습니다.


1. 먼저 에디터를 실행하고 프로젝트를 열어줍니다.

1.jpg 


2. 기본적으로 이 에디터에는 base 라는 프로젝트가 있으며, 여기에 매크로를 추가 할 수 있습니다.

2.jpg 


3. base 프로젝트를 열어보면 여러가지 기본적인 매크로들이 작성돼 있으며, 맨 아래에 그림과 같이 매크로를 추가 해 줍니다.

( 매크로 출처 : http://windrevo.egloos.com/393730 )

매크로는 누군가가 만들어놓은 것을 가져다 쓰면 그만이지 구지 끙끙대며 만들어낼 필요는 없다고 봅니다.

링크된 사이트에서 소스전체를 복사해서 추가 해 줍니다.

그리고나서 저장하고 닫습니다.

3.jpg

3. 이제 현재 작업중인 프로젝트를 오픈하고, 거기서 작성해둔 매크로를 키로 등록 하면 됩니다.

 open - key assignments.. 를 선택해 줍니다.

4.jpg 


4. 먼저 등록해 둔 Macro:remark_all 을 선택 합니다.

5.jpg 


5. 매크로를 선택 한 다음 중앙의 Assign New Key.. 를 눌러주면 팝업이 나타나는데. 이때 눌러주는 key 가 매크로

실행키가 됩니다. 일반적으로 Ctrl 을 포함해서 임의의 키로 등록 하며, 저는 Ctrl + Shift + / 를 주석으로 설정 해 보았습니다.

6.jpg


6. 이제 등록된 매크로를 실제로 사용해 보겠습니다.

임의의 영역을 쭉 선택한 다음 매크로로 등록한 키를 누르면 주석을 입력 하도록 팝업이 나타 나며, 내용을 입력 하고 엔터를 누릅니다.

7.jpg


7. 선택 영역이 주석처리 된 것을 확인 할 수 있습니다.

8.jpg


여기까지 주석처리 하는 매크로를 등록 하는 방법이었습니다.

그외에도 시간을 입력 하는 매크로, 라인을 추가하는 매크로..헤더를 선언하는 매크로.. 등등 다양한 

매크로들을 정의해서 쓸수 있으며, 그런 매크로 소스는 위에서 말했듯이 끙끙대며 만들지 말고, 

웹상에서 검색하면 금방 찾을 수 있습니다.

Posted by 컴투