실행 및 디버깅

Ctrl + F11 : 이전에 실행되었던 Run파일 실행.

Ctrl + Shift + B : 현 커서의 위치에 브레이크 포인터 설정/해제

F11 : 디버깅 시작

F8 : 디버깅 계속

Ctrl + R: 현재 라인까지 실행(Run to Line)

F6 : 한 줄씩 실행(Step Over)

F5: 한 줄씩 실행하되 함수일 경우 그 함수 내부로 들어감(Step Into)

F7 : Step Return

Ctrl + F2 : 프로그램 종료

<!--[if !supportEmptyParas]--> <!--[endif]-->

<!--[if !supportEmptyParas]--> <!--[endif]-->

Editor 단축키(소스 추가, 수정, 이동, 삭제, 정렬 등)

Ctrl + D Delete Line - 줄 삭제

Ctrl + Alt + UP or DOWN : Duplicate Lines - 줄 복사

Ctrl + Shift + ENTER : Insert Line Above Current Line - 현재 줄에 새로 추가

Shift + ENTER : Insert Line Below Current Line - 다음 줄에 새로 추가

Ctrl + N : 새로운 파일 및 프로젝트 생성.

Ctrl + / or \: Toggle Comment - 한줄 주석 및 해제

Ctrl + Shift + / or \: 블럭 주석 설정 및 해제

Ctrl + Shift + F: 코드 자동 정리(선택한 블록을 자동으로 줄을 정렬함)

Ctrl + I : Indent Line - 제대로 된 위치의 들여쓰기

Ctrl + Shift + F : Format - 탬플릿에 지정된 대로 코드 포맷 변경

Ctrl + Shift + M: 특정 클래스 Import 시키기

Ctrl + Shift + O : Organize Imports - 필요없는 import 제거

Alt + Shift + J : Add Javadoc Comment - Javadoc타입의 주석 붙임

Alt + Shift + UP or Down: 커서를 기준으로 토큰단위 블록지정 및 해제

Alt + Shift + J: 자동으로 주석 달기 (메소드나 멤버변수에 포커스 두고 실행)

Alt + Shift + Z : Surround With 메뉴 표시

Alt + Shift + S : Source Quick Menu - 빠른 소스메뉴

Ctrl + M : Maximize Active View or Editor - 선택된 뷰 최대화

Ctrl + Shift + S : 모두 저장

Ctrl + Shift + W : 모두 닫기

Ctrl + Shift + R : 자원 열기

Ctrl + Shift + Y : 대문자를 소문자로

Ctrl + Shift + X : 소문자를 대문자로

Ctrl + Shift + E : 커서에서 줄 끝가지 삭제

Ctrl + Shift + F : 코드 자동 정리

/** + Enter를 쳐도 자바 주석

<!--[if !supportEmptyParas]--> <!--[endif]-->

Assist comment 단축키(Quick Fix 등 도움을 주는 기능들)

Ctrl + Space : Content Assist - 코드 작성을 도와준다. 자동완성을 지원함

Ctrl + Shift + Space : Parameter 힌트 표시

Ctrl + 1: Quick Fix. 에러가 발생했을 경우 Quick Fix를 통해 쉽게 해결이 가능하다.

Ctrl + . or , : 다음/이전 어노테이션(에러, 경고)으로 이동

F12 : 컴파일 중 에러등으로 포커스가 다른데로 갔을 때 Editor 로 커서 이동

sysout + Ctrl + Space : System.out.println() 자동 완성

try + Ctrl + Space : try{}catch(){} 자동 완성

for + Ctrl + Space : for문 자동 완성

<!--[if !supportEmptyParas]--> <!--[endif]-->

Find(찾기)

Ctrl + F : 찾기/바꾸기

Ctrl + H : 자바의 클래스, 타입, 함수 이름 등으로 찾을 수 있다. Search 다이얼로그 표시

Ctrl + J + next(Down, Up) : 점층적 찾기

Ctrl + Shift + J : 역으로 점층적 찾기

Ctrl + Shift + G: 특정 메써드나 필드를 Reference하고 있는 곳을 찾는다.

Ctrl + K : Selection Word Search - 선택한 문자열과 동일한 다음 문자열 찾기

Ctrl + Shift + K : 선택한 문자열과 동일한 이전 문자열 찾기

Ctrl + Shift + T : 클래스 찾기(Open Type 다이얼로그 표시)

<!--[if !supportEmptyParas]--> <!--[endif]-->

Move(이동)

Ctrl + L: 특정 줄번호로 가기

Ctrl + Shift + P : 매칭되는 괄호로 이동

F3 : 선택한 요소의 선언된 곳으로 이동

Ctrl + PgUp or PgDn : 다음/이전 에디터를 활성화

Ctrl + F6 : 다음 에디터로 이동(Ctrl + Tab 기능)

Ctrl + RIGHT : Next Word - 다음 문자로 이동

Ctrl + LEFT : Previous Word - 이전 문자로 이동

Ctrl + Q : 가장 최근 편집한 위치로 이동(단축키로 이동했을 때, 이전 작업으로 돌아가기)

Ctrl + E : 다음 에디터로 이동

Ctrl + Shift + F5 : 이전 에디터로 이동

Ctrl + Shift + E : Switch to Editor - 열려있는 에디터간 이동

Ctrl + F8 : 다음 Perspective로 이동(java->javaEE->SVN->...)

Ctrl + Shift + F8 : 이전 Perspective로 이동(java->javaEE->SVN->...)

Alt + <- : 이전 작업 화면

Alt + -> : 다음 작업 화면

Ctrl + F7 : 다음 View로 이동.(Package Explorer->Editor->Explorer->...)

Ctrl + Shift + F7 : 이전 View로 이동.

Ctrl + Shift + Up or Down : 클래스의 이전(또는 다음) 맴버로 이동

F10 : 메뉴창을 활성화

<!--[if !supportEmptyParas]--> <!--[endif]-->

View(트리 및 단축키 등 구조 보기)

Ctrl + Shift + L : 단축키 보기 (한 번 더 누르면 키 설정메뉴로 들어감)

Ctrl + Alt + H : 메서드 호출 구조 표시

F4 : Open Type Hierarchy - 현재 클래스의 상속관계를 보여주는 창이 열린다.

Ctrl + T : Quick Hierarchy - 간단하게 현재 클래스의 상속 관계를 보여준다.

Ctrl + O : Quick Outline - 현재 클래스의 메서드, 맴버변수등을 보여준다.

<!--[if !supportEmptyParas]--> <!--[endif]-->

Refactoring 단축키

Alt + Shift + T : Refactor Quick Menu - 리펙토링 메뉴 바로가기

Alt + Shift + R: 이름 변경(Rename)

Alt + Shift + V : 이동(Move)

Alt + Shift + C : Change Method Signature

Alt + Shift + M : Extract Method

Alt + Shift + L : Extract Local Variable

Alt + Shift + I : Inline

기타 팁

Eclipse 단축키 확인 및 변경

Eclipse의 모든 단축키는 Window >> Preferences >> Workbench >> Keys 메뉴에서 확인 및 변경이 가능하다. 그 동안 다른 툴에서 자신의 손에 익숙한 단축키들이 있다면 이 메뉴에서 단축키들을 변경하는 것이 가능하다.

<!--[if !supportEmptyParas]--> <!--[endif]-->

이클립스 단축키 저장 파일

%workspace%\.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.ui.workbench.prefs

<!--[if !supportEmptyParas]--> <!--[endif]-->

이클립스 에디터 클릭시 패키지익스플로러에서 경로를 자동으로 찾아가게 하시려면

탐색트리 상단 우편에 드답다운메뉴 클릭하시고 link with editor 체크해주시면 됩니다

Posted by 모과이IT
,

윈도우 XP 단축키 모음

 

■ Alt 키 함께 사용하기

 Alt + → : 웹사이트 앞으로가기

Alt + ← : 웹사이트 이전페이지

Alt + 메뉴 이름에서 밑줄이 표시된 문자 : 해당 메뉴 표시

Alt + 밑줄 표시 문자 : 해당 명령을 수행하거나 해당 옵션을 선택

Alt + 빼기 : 기호 활성 콘솔 창의 창 메뉴 표시

Alt + 스페이스바 : 활성 창의 바로 가기 메뉴 열기

Alt + 스페이스바 : 활성 창의 시스템 메뉴 표시

Alt + 스페이스바 : MMC 창 메뉴 표시

Alt + A : 동작 메뉴 표시

Alt + Delete : Windows 메뉴 표시

Alt + Enter : 선택한 항목의 등록 정보 보기

Alt + Enter : 있을 경우 선택한 항목의 등록 정보 대화 상자 표시

Alt + Esc : 연 순서대로 항목을 순환

Alt + F : 파일 메뉴 표시

Alt + F4 : 활성 항목을 닫거나 활성 프로그램을 종료

Alt + F4 : 콘솔 닫기

Alt + Home : 시작 메뉴 표시

Alt + Insert : 가장 최근에 사용한 순서대로 프로그램을 순환

Alt + O : 즐겨찾기 메뉴 표시

Alt + Page Down : 프로그램 사이에서 오른쪽에서 왼쪽으로 전환

Alt + Page Up : 프로그램 사이에서 왼쪽에서 오른쪽으로 전환

Alt + Shift + Num Lock : 마우스키를 설정하거나 해제

Alt + Shift + Print Screen : 고대비를 켜거나 끔

Alt + Tab : 열린 항목 사이에서 전환

Alt + V : 보기 메뉴 표시

 

 

■ Ctrl 키 함께 사용하기

 

CD-ROM을 넣을 때 Shift 키 : CD-ROM이 자동으로 재생되지 않게 함

Ctrl + ↑ : 삽입 지점을 이전 단락의 처음으로 이동

Ctrl + ↓ : 삽입 지점을 다음 단락의 처음으로 이동

Ctrl + → : 삽입 지점을 다음 단어의 처음으로 이동

Ctrl + ← : 삽입 지점을 이전 단어의 처음으로 이동

Ctrl + 휠마우스 ↑또는↓ : 위로(텍스트 글꼴 확대), 아래로(글꼴 작게)

Ctrl + A : 모두 선택

Ctrl + B : 즐겨찾기 구성 대화 상자 열기

Ctrl + C : 복사

Ctrl + E : 검색 창 열기

Ctrl + End : 마지막 문자로 이동

Ctrl + Esc : 시작 메뉴 표시

Ctrl + F : 찾기 유틸리티 시작

Ctrl + F10 : 활성 콘솔 창을 최대화

Ctrl + F4 : 여러 문서를 동시에 열 수 있는 프로그램에서 활성 문서 닫기

Ctrl + F4 : 활성 콘솔 창 닫기. 콘솔에 콘솔 창이 하나만 있을 경우 이 바로 가기 해당 콘솔을 닫습니다.

Ctrl + F5 : 활성 콘솔 창을 원래 크기로 복원

Ctrl + H : 열어본 페이지 목록 창 열기

Ctrl + Home : 처음 문자로 이동

Ctrl + I : 즐겨찾기 창 열기

Ctrl + L : 열기 대화 상자 열기

Ctrl + M : 콘솔 항목을 추가 또는 제거

Ctrl + N : 새 콘솔 열기

Ctrl + N : 브라우저의 다른 인스턴스를 같은 웹 주소로 시작

Ctrl + O : 열기 대화 상자 열기, Ctrl+L과 동일

Ctrl + P : 현재 페이지나 활성 창 인쇄

Ctrl + R : 현재 웹 페이지 업데이트

Ctrl + S : 연 콘솔 저장

Ctrl + Tab : 탭을 통해 앞으로 이동

Ctrl + V : 붙여넣기

Ctrl + W : 새 창 열기

Ctrl + W : 현재 창 닫기

Ctrl + X : 잘라내기

Ctrl + Z : 실행취소

Ctrl + 항목을 끌기 : 선택한 항목을 복사

 

 

■ Ctrl + Alt 키 함께 사용하기

 

Ctrl + Alt + 더하기 기호 : 전체 클라이언트 창 영역의 스냅샷을 터미널 서버 클립보드에 놓고 로컬 컴퓨터에서 Alt+Print Screen을 누르는 것과 같은 기능을 제공

Ctrl + Alt + 빼기 기호 : 클라이언트의 활성 창 스냅샷을 터미널 서버 클립보드에 놓고 로컬 컴퓨터에서 Print Screen을 누르는 것과 같은 기능을 제공

Ctrl + Alt + Break : 클라이언트 컴퓨터를 창과 전체 화면 사이에서 전환

Ctrl+Alt + End : Microsoft Windows NT 보안 대화 상자 열기

 

 

■ Ctrl + Shift 키 함께 사용하기

 

Ctrl + Shift + →←↓↑키 : 텍스트 블록 강조 표시

Ctrl + Shift + Tab : 탭을 통해 뒤로 이동

Ctrl + Shift + 항목을 끌기 : 선택한 항목의 바로 가기를 만듬

 

 

■ Shift 키 함께 사용하기

 

Shift + 휠마우스 ↑또는↓ : 위로(웹페이지 앞으로), 아래로(웹페이지 뒤로)

Shift + Delete : 선택한 항목을 휴지통에 넣지 않고 영구적으로 삭제

Shift + F10 : 선택한 항목의 바로 가기 메뉴 표시

Shift + F10 : 선택한 항목의 동작 바로 가기 메뉴 표시

Shift + Tab : 이전 옵션으로 이동

Shift 키를 다섯 번 : 고정키를 설정하거나 해제

Shift + →←↓↑키 : 창이나 바탕 화면에서 둘 이상의 항목을 선택하거나 문서에서 텍스트를 선택

 

 

■ Windows로고 키 함께 사용하기

 

Windows로고 : 시작 메뉴를 표시하거나 숨김

Windows로고 + Break : 시스템 등록 정보 대화 상자 표시

Windows로고 + Ctrl + F : 컴퓨터 검색

Windows로고 + D : 바탕 화면 표시

Windows로고 + F : 파일이나 폴더 검색

Windows로고 + F1 : Windows 도움말 표시

Windows로고 + L : 윈도우 잠금 / 사용자 전환

Windows로고 + M : 모든 창을 최소화

Windows로고 + R : 실행 대화 상자

Windows로고 + Shift + M : 최소화된 창을 원래 크기로 복원

Windows로고 + U : 유틸리티 관리자 열기

Windows로그 + E : 내 컴퓨터 열기

 

 

■ 펑션키

 

F1 키 : 도움말 표시

F2 키 : 선택한 항목의 이름 바꾸기

F3 키 : 파일 또는 폴더 찾기

F4 키 : 내 컴퓨터나 Windows 탐색기에서 주소 표시줄 목록 표시

F4 키 : 활성 목록에 항목을 표시

F5 키 : 활성 창 업데이트

F5 키 : 모든 콘솔 창의 내용 업데이트

F6 키 : 창이나 바탕 화면의 화면 요소를 순환

F10 키 : 활성 프로그램의 메뉴 모음 활성화

 

 

■ 기타 단축키

 

백스페이스 키 : 내 컴퓨터나 Windows 탐색기에서 한 레벨 위의 폴더 보기.

다른 이름으로 저장 또는 열기 대화 상자에서 폴더를 선택한 경우 한 수준 위의 폴더 열기

스페이스바 : 활성 옵션이 확인란인 경우 확인란을 선택하거나 선택 취소

오른쪽Shift 키를 8초누름 : 필터키를 설정하거나 해제

화살표 키 : 활성 옵션이 옵션 단추 그룹인 경우 단추 하나를 선택

Delete : 삭제

End : 활성 창의 맨 아래 쪽을 표시

End : 해당 줄의 끝으로 이동

Enter : 활성 옵션이나 단추에 대한 명령 수행

Esc : 현재 작업 취소

Home : 활성 창의 맨 위 쪽을 표시

Home : 해당 줄의 처음으로 이동

Num Lock + 더하기 기호 : 선택한 폴더의 내용물을 표시

Num Lock + 별표 : 선택한 폴더 아래에 있는 모든 하위 폴더를 표시

Num Lock + 빼기 기호 : 선택한 폴더를 축소

Num Lock 키를 5초누름 : 토글 키를 설정하거나 해제

Page Down : 한 번에 한 화면 아래로 이동

Page Up : 한 번에 한 화면 위로 이동

Tab : 다음 옵션으로 이동

Posted by 모과이IT
,
Posted by 모과이IT
,
Posted by 모과이IT
,
Posted by 모과이IT
,

■ CCmdUI 클래스

。기능

- 사용자 인터페이스 갱신과 관련된 기능을 수행하며 ON_UPDATE_COMMAND_UI 매크로로 연결되는 이벤트 처리기에 사용한다.

- 연결된 이벤트 처리기는 ON_COMMAND로 이미 등록되어 있는 이벤트 상태에 변경이 있을 때 이를 업데이트 시킨다.

 

- 연결된 이벤트 처리기는 이 클래스의 인스턴스 포인터를 매개변수로 넘겨받는다.

- 이벤트명이 ID_BEGIN이라면 이를 갱신하는 이벤트 처리기는 OnUpdateBegin()이 된다.

 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

     . . .

     ON_UPDATE_COMMAND_UI( ID_BEGIN, OnUpdateBegin)

     ON_UPDATE_COMMAND_UI( ID_END, OnUpdateEnd)

 END_MESSAGE_MAP()

 

 void CCmdUIView::OnUpdateBegin(CCmdUI *pCmdUI)

 {

   pCmdUI->Enable(!m_bStart) ;

 } 

 void CCmdUIView::OnUpdateEnd(CCmdUI *pCmdUI)

 {

   pCmdUI->Enable(!m_bStart) ;

 }

 

。주요 멤버변수 : 갱신할 사용자 인터페이스의 이벤트 ID를 나타내는 UNIT 형의 m_nID가 있다.

。주요 멤버 함수

 멤버 함수  기능 
 Enable  BOOL형 매개변수를 받아 사용자 인터페이스를 활성화/비활성화 시킴.
 SetText  사용자 인터페이스의 텍스트를 변경시킴.
 SetCheck  int형 매개변수를 받아 체크 표시를 하거나 없앰.
 SetRadio  SetCheck 함수와 비슷한 기능. 단, 체크 표시대신 점이 찍힘.

 

------------------------------------------------------------------------------------------

 

- 우선 다음과 같은 이벤트 처리기가 정의되어 있다고 가정한다.

 BEGIN_ MESSAGE_MAP(CCmdUIView, CView)

      ...

      ON_COMMNAD( ID_BEGIN, OnBegin )

      ON_COMMAND( ID_END, OnEnd )

 END_MESSAGe_MAP()

 

 void CCmdUIView::OnBegin()

 {

     m_bStart = TRUE ;

 }

 

 void CCmdUIView::OnEnd()

 {

     m_bStart = FALSE ;

 }

 

 

■ Enable 함수

- 메뉴 항목을 상황에 다라 활성화 시키거나 비활성화 시킨다.

 

。상태변수 만들기

- 활성화인지 비활성화 인지의 상황을 기억하는 상태 변수가 필요하다.

 class CCmdUIView : public CView

 {   ...

     BOOL m_bStart ;

 }

 

- 상태 변수를 클래스 생성자 함수에서 초기화 해 준다.

 CCmdUIView::CCmdUIView()

 {  ...

     m_bStart = FALSE ;

 }

 

。사용자 인터페이스 갱신 메세지 처리기 등록  

- ON_UPDATE_COMMAND_UI로 등록한다.

 BEGIN_ MESSAGE_MAP(CCmdUIView, CView)

      ...

      ON_UPDATE_COMMNAD_UI( ID_BEGIN, OnBegin )

      ON_UPDATE_COMMNAD_UI( ID_END, OnEnd )

 END_MESSAGe_MAP()

 

。메세지 처리기 활성/비활성 상태 제어

- Enable 함수를 호출하여 매개변수로 TRUE(활성화) 또는 FLASE(비활성화)를 넘긴다.

- 이벤트 처리기에 넘겨지는 매객변수 pCmdUI에는 메뉴 항목에 대한 정보가 담겨 있다.

- CCmdUI 클래스의 멤버 함수들을 호출하면 해당 메뉴 항목을 제어할 수 있다.

 void CCmdUIView::OnUpdateBegin(CCmdUI *pCmdUI)

 {

     pCmdUI->Enable(!m_bStart) ;

 }

 void CCmdUIView::OnUpdateEnd(CCmdUI *pCmdUI)

 {

     pCmdUI->Enable(!m_bStart) ;

 }

 

'개발지식창고 > MFC' 카테고리의 다른 글

[MFC] CWebBrowser2 클래스 추가하기  (0) 2012.01.11
VS2005 -> VS2008 변환시 주의할점  (0) 2011.07.22
ON_COMMAND 와 ON_MESSAGE 의 차이점  (0) 2011.07.19
클립보드 사용법2  (0) 2010.10.27
클립보드 사용법 1  (0) 2010.10.27
Posted by 모과이IT
,

Visual C++ ,MFC 를 사용한 프로그램시 나오는 내용입니다.

 

ON_COMMAND와 ON_MESSAGE 모두 macro로 코딩을 편하게 하기위해 사용한다고 볼수 있습니다.

 

차이점은 ON_COMMAND는 command id의 핸들러를 설정하는 함수로

사용법이 ON_COMMAND(id, memberFxn) 입니다.

즉  command id가 실행되면 memberfFxn 멤버 함수를 호출하라는 뜻입니다.

 

여기서 command id란 버튼의 ID 또는 menu의 ID입니다.

각 메뉴, 버튼에는 자신을 구분하기 위한 ID를 가지고 있고 사용자가 메뉴의 항목을 실행하거나 버튼을 누르면 WM_COMMAND 메세지가 발생하고 이 메세지의 인자중 하나가 선택한 항목의 ID입니다.

MFC 라이브러리는 WM_COMMAND의 인자로 전달된 ID를 ON_COMMAND macro에 설정된 값들과 비교해서 같은 값을 발견하면 그 ID의 멤버함수로 설정된 함수를 호출합니다.

 

ON_COMMAND가 ID의 멤버함수를 설정하는 것에 반해

ON_MESSAGE는 상용자 정의 메시지의 핸들러(멤버함수)를 설정하는 함수입니다.

 

WM_ 으로 시작하는 기본윈도우 메시지 이외에 사용자가 메시지를 정의할수 있습니다.

예를 들어 WMU_USERMSG 라고 사용자 정의 메세지를 정의하고

 

ON_MESSAGE(WMU_USERMSG, OnMyMsg)

 

이렇게 하면 WMU_MESSAGE가 발생하면 OnMyMsg 멤버함수가 호출됩니다.

 

다시 간단히 정리하면

ON_COMMAND 는 ID의 handler를

ON_MESSAGE는 사용자 정의 메시지의 handler를  멥핑시키는 macro입니다

Posted by 모과이IT
,

1. WIN32 VS WIN64

(1) 64 비트와 32 비트

- 한번에 CPU 가 송수신할 수 있는 데이터 크기와 한번에 처리할 수 있는 데이터 크기를 기준으로 32 비트와 64 비트 컴퓨터를 구분짓는다.

 

(2) 주소값의 크기

- 주소값의 크기는 크면 클수록 좋다. 메모리 공간의 활용이 크만큼 커지기 때문이다. 그러나 주소값의 크기를 무한정 늘릴수는 없는데 왜냐하면 컴퓨터에서 한번에 전송되고 처리되는 데이터의 크기에 따라 주소값의 크기는 종속되기 때문이다. 따라서 32 비트 컴퓨터에서 주소값은 32 비트 (4바이트) 로 표현되며, 64 비트 컴퓨터에서는 64 비트 (8바이트) 로 표현된다.

2. 프로그램 구현 관점에서의 WIN32 VS WIN64

- 마이크로소프트에서는 64 비트 기반의 운영체제를 내놓으면서도 32 비트 시스템과의 호환성을 중시하였다. 그로 인해 프로그래밍 스타일에 대한 가이드를 제시하고 있는데, 이것을 따르는 것이 바로 64 비트 기반 프로그래밍 스타일의 기본이다.

(1) LLP64 VS LP64

- 지금까지 우리는 int, long, 포인터 모두 4바이트로 표현된다고 알고 있었다. 이것은 32 비트 환경에서 WIndows 가 기본자료형과 포인터를 표현하는 방식이다. 그러나 64 비트 컴퓨터에서는 다음과 같이 표현한다.

- LLP64 : Windows 에서 LLP64 라는 데이터 표현 모델은 int, long 은 그대로 4바이트로 표현하고 포인터만 8바이트로 표현한다. 따라서 32 비트 시스템과의 호환성을 중시한 모델이라고 말한다.

- LP64 : UNIX 에서는 LP64 모델을 취하는데, Windows 의 LLP64 모델과 차이가 나는 부분은 long 또한 8바이트로 표현한다는 점이다.

 

(2) 64 비트와 32 비트 공존의 문제점

- 64 비트 시스템에서는 포인터가 지니고 있는 주소값을 4 바이트 정수형으로 형 변환해서는 안된다.

 

(3) Windows 스타일 자료형

- 다른 시스템으로의 이식성을 고려한다면 기본 자료형을 사용하거나 프로젝트의 성격 및 특성에 맞게 새로운 이름으로 자료형을 정의하는 것이 좋은 방법이다. 다만 Windows 기반에서의 실행만 고려한다면, 마이크로소프트에서 정의하고 있는 자료형을 사용하는 것도 좋은 선택이 될 수 있다.

- 다음은 마이크로소프트에서 정의하고 있는 많은 양의 자료형 중에서 ANSI 기본 자료형에 대응하는 일부를 보여준다. (첨부표 참고) 이미 앞에서도 문자열 관련 자료형을 몇몇 소개하였다. (TCHAR, LPTSTR, LPCTSTR)

- 위 표를 보면 WIN64 로 넘어가면서, 새로운 자료형 (끝이 32, 64 로 끝나는) 이 상당수 추가되었음을 알 수 있는데, 이는 WIN32 와 WIN64 에서 시스템에 상관없이 동일한 의미를 지니는 자료형을 표현하기 위한 것이다. ~32 형태의 자료형은 시스템에 상관없이 32비트로 표현되고, ~64 형태의 자료형은 시스템에 상관없이 64비트로 표현된다.

* Microsoft C/C++ 에서는 정수 타입으로 크기를 지정해서 선언하는 것이 가능하다. __int(n) 의 형태로 8, 16, 32, 64 를 지정해서 변수를 선언할 수 있다. 즉, __int8, __int16, __int32, __int64 와 같은 타입 선언이 가능하다. 이들은 각각 ANSI 표준의 char, short, int 에 해당한다. 다만 __int64 는 ANSI 표준에 존재하지 않는, Microsoft C/C++ 에만 존재하는 자료형이다. 그러나 기본 자료형과 마찬가지로 사칙연산이 가능하다는 아주 멋진 특성을 지닌다.

- WIN64 로 이전하면서 등장한 자료형들을 사용할 경우, 변수 선언 시 할당된 바이트 수를 정확하고도 쉽게 파악할 수 있어서 도움은 되지만, 그렇다고 WIN32 시절에 정의된 자료형이 WIN64 환경에서 쓸모가 없어진 것은 아니다.

 

(4) Polymorphic 자료형

- 포인터값 기반의 산술연산을 위해 정의된 자료형이다. 32비트 시스템과 64비트 시스템의 포인터 크기가 다르기 때문에 발생할 수 있는 문제를 해결하기 위해 등장한 자료형이다.

#if defined(_WIN64)

   typedef __int64 LONG_PTR;

   typedef unsigned __int64 ULONG_PTR;

   typedef __int64 INT_PTR;

   typedef unsigned __int64 UINT_PTR;

#else

   typedef long LONG_PTR;

   typedef unsigned long ULONG_PTR;

   typedef int INT_PTR;

   typedef unsigned int UINT_PTR;

#endif

* 매크로 _WIN64는 64비트 기반으로 프로젝트 구성시 자동적으로 삽입되는 매크로이다. 32비트 기반으로 프로젝트 구성시 마찬가지로 매크로 _WIN32 가 자동 삽입된다. 따라서 이 매크로는 시스템 환경에 따라서 조건부 컴파일 및 실행하는데 있어서 기준이 된다.

* Polymorphic 자료형을 이용하면 주소값을 64비트 환경에서는 64비트로 32비트 환경에서는 32 비트로 표현할 수 있다.

3. 오류의 확인

- Windows 시스템 함수를 호출하는 과정에서 오류가 발생하면, GetLastError 함수 호출을 통해 오류의 원인을 확인할 수 있다. 많은 수의 Windows 시스템 함수들은 오류가 발생했을 때 NULL 을 반환한다. 반환되는 NULL 값으로 오류가 발생했음을 알 수 있지만, 원인은 알 수가 없다. 오류가 발생했을 때, 이어서 바로 GetLastError 함수를 호출하면 오류의 원인에 해당하는 에러코드를 얻을 수 있다.

DWORD GetLastError(void);

- MSDN 을 참조하면 시스템 에러코드의 종류와 해당 에러코드가 의미하는 바를 알 수 있다.

- 오류 확인은 오류가 발생한 직후에 바로 한다. 에러코드는 Windows 시스템 함수가 호출 될 때마다 갱신되기 때문이다.


Posted by 모과이IT
,
\r\n CString 개행문자
Posted by 모과이IT
,

웹브라우저 컨트롤을 사용할 때, 프로그램에서 로드된 도큐먼트의 소스를 가져오고 싶을 때가 있다. 인터넷 익스플로러에서 `보기` / `소스` 를 했을 때처럼 말이다. 쉬울듯하나 그리 간단하지는 않다.

 

제일 쉬운방법은 IHTMLDocument3에 있는 documentElement 개체를 얻어다 이것의 OuterHTML 프로퍼티를 읽어오는 것이다. 제법 그럴듯한 게 나오므로 대부분의 경우 이 방법을 사용하면 문제가 없다. 단 하나의 문제는 여기에 나오는 것이 웹서버가 준 도큐먼트 소스가 아니라 인터넷 익스플로러의 HTML 파서가 한 번 파싱해 놓은 도큐먼트라는 것이다. 그래서 서버가 준 것과 똑 같은 도큐먼트를 얻고자 할 때는 사용할 수가 없다.

 

그래서 일반적으로 할 수 있는 방법은 IHTMLDocument2로부터 IPersistStreamInit을 얻어와서 이것의 Save() 메쏘드를 이용하는 것이다. 이걸 할려면 IStream 개체가 있어야 하는데 ::CreateStreamOnHGlobal()이라는 아주 훌륭한 넘으로 쉽게 맹글 수 있다. 처음엔 HGlobal을 만들고 위에 함수를 불렀는데, 읽어올 도큐먼트의 크기를 미리 알아야 한다는 문제가 있었다. 하지만 그냥 NULL을 ::CreateStreamOnHGlobal()에 넘겨주면 알아서 메모리를 할당하므로 크기를 알아올 필요가 없어져서 좋다. 내부 버퍼를 알아올라면 ::GetHGlobalFromStream()을 쓰면 된다.

 

MSDN 어딘가를 뒤져보며 있는데 위치를 까먹었다. ㅠㅠ

 

// 웹브라우저 컨트롤에서 가져화서 설정한다.

// 설정하는 방법은 다른데서 설명하기로 하자.

IHTMLDocument pDoc;

 

IStream * pStream = NULL;
IPersistStreamInit * pPSI = NULL;

HGLOBAL hHTMLContent;
HRESULT hr;
bool bResult = false;
BYTE* buff = NULL; // 여기다 소스를 담는다

 

hr = ::CreateStreamOnHGlobal(NULL, TRUE, &pStream);
if (SUCCEEDED(hr))
{
    // request the IPersistStreamInit interface
    hr = pDoc->QueryInterface(IID_IPersistStreamInit, (void **) &pPSI);
    if (SUCCEEDED(hr))
    {
        hr = pPSI->Save(pStream, FALSE);
        if (SUCCEEDED(hr))
        {
            hr = ::GetHGlobalFromStream(pStream, &hHTMLContent);
            if (SUCCEEDED(hr))
            {
                bResult = true;
                LPVOID data = ::GlobalLock(hHTMLContent);
                DWORD size = ::GlobalSize(hHTMLContent);
                buff = new BYTE[size + 1];
                ::memcpy(buff, data, size);
                buff[size] = '\0';
                ::GlobalUnlock(hHTMLContent);
            }
        }
        pPSI->Release();
    }
    // implicitly calls ::GlobalFree to free the global memory
    pStream->Release();
}

 =======================================================================================================
[다른방법]

홈페이지 소스 가져오기

//웹페이지 소스 가져오기
 IWebBrowser2* pBrowser2;

 HRESULT hr;

 hr=OleInitialize(NULL);

    if(!SUCCEEDED(hr))
        return FALSE;

 CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (LPVOID *)&pBrowser2);

  
      BSTR bstrURL = SysAllocString(L"http://news.naver.com/sports/new/main/index.nhn");

    if(pBrowser2)
    {  
 
    VARIANT vEmpty;
       VariantInit(&vEmpty);

       hr = pBrowser2->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
    }


 IHTMLDocument2*  pHTMLDocument2;
 LPDISPATCH lpDispatch;
 pBrowser2->get_Document(&lpDispatch);


 

 CString szSource = "";

    if (lpDispatch)
 {
  HRESULT hr;
  hr = lpDispatch->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pHTMLDocument2);
  lpDispatch->Release();

  IHTMLElement*  pBody;
  hr = pHTMLDocument2->get_body(&pBody);

  BSTR bstr;              
  pBody->get_innerHTML(&bstr);

  int nLen;
  char* szTarget;
  nLen = (int)wcslen(bstr) * 2 + 1;
  szTarget = new char[nLen];
     ::WideCharToMultiByte(CP_ACP, 0, bstr, -1, szTarget, nLen, NULL, NULL );

  szSource.Format("%s", szTarget);

   
  SysFreeString(bstr);
  pBody->Release();

  delete szTarget;


 }

 pBrowser2->Quit();

 SysFreeString(bstrURL);
    pBrowser2->Release();

 OleUninitialize();


 

Posted by 모과이IT
,