반응형

via@ https://www.wholetomato.com/features 

 

안 써본 사람은 있어도, 한 번만 써본 사람은 없다는 Visual Assist.

MS사의 Visual Studio 제품군을 이용한다면 한번씩은 들어봤을 터이고, 사용해봤을 범한 편리한 툴이다.

 

C#에서는 사용빈도가 높진 않지만 C++쪽에서는 은근 사용빈도가 높아 정리를 해보았다.

 

자주쓰는 단축키는 공식홈페이지의 문서에서 참조하여 정리하였다.

 

단축키는 기본 설정값 기준이다.

명령 설명 단축키
참조 찾기
(FindReferences)
현재 커서에 선택된 변수/함수가 참조되는곳 모두 찾기 Shift+Alt+F
심볼 찾기
(FindSymbolDialog)
대화상자가 나타나며, 키워드를 포함하는 현재 솔루션내 존재하는 심볼 나열 Shift+Alt+S
정의로 이동
(GotoImplementation)
현재 커서에 선택된 변수/함수 정의로 이동 Alt+G
헤더/소스 파일 전환
(OpenCorrespondingFile)
현재 문서의 헤더/소스 파일로 전환 Alt+O
파일 찾기
(OpenFileInSolutionDialog)
대화상자가 나타나며, 키워드를 포함하는 현재 솔루션 내 존재하는 파일 나열 Shift+Alt+O
리펙터 네이빙 변경
(RefactorRename)
현재 커서에 선택된 변수/함수의 네이밍 변경 대화상자.
(한번에 해당 변수/함수의 이름을 바꿀수 있어 유용)
Shift+Alt+R
스마트 선택영역 확장
(SmartSelectExtend)
현재 커서를 기준으로 여러번 누를시 선택영역 범위를 점차 늘림 (단어->문장->문단->블럭 순) Shift+Alt+]
스마트 블럭 선택영역 확장
(SmartSelectExtendBlock)
현재 커서를 기준으로 여러번 누를시 선택영역 범위를 블럭 단위로 늘림 Alt+]
스마트 선택영역 축소
(SmartSelectShrink)
위의 SmartSelectExtend와 반대되는 기능
선택 영역 범위를 점차 줄임
Shift+Alt+[ 
스마트 블럭 선택영역 축소
(SmartSelectShrinkBlock)

위의 SmartSelectExtendBlock와 반대되는 기능
선택영역 범위를 블럭단위로 줄임
Alt+[
반응형

MFC에서 각 윈도우 핸들간 메시지를  전달하는 방법으로 SendMessage와 PostMessage가 있다.

이 둘은 비슷하면서도 차이가 있다.

가장 많이 쓰는 곳이 쓰레드에서 UI 접근할때가 아닌가 싶다.

 

이 둘의 차이점을 가장 쉽게 표현하자면 비동기화와 동기화 차이라고 할 수 있다.

SendMessage

함수 원형

LRESULT SendMessage(
  HWND   hWnd,
  UINT   Msg,
  WPARAM wParam,
  LPARAM lParam
);

동작

SendMessage를 호출하게 되면 해당 윈도우의 메시지프로시져가 즉각 호출되어 해당 메시지의 처리가 끝날때까지 리턴하지 않는다.

즉, 동기화가 된다.

 

활용

해당 메시지 처리 작업이 길지 않은 곳에 사용하면 될것 같다. 간단한 UI 업데이트 등..

 

PostMessage

함수 원형

BOOL PostMessage(
  HWND   hWnd,
  UINT   Msg,
  WPARAM wParam,
  LPARAM lParam
);

동작

PostMessage를 호출하게 되면 해당 윈도우의 메시지 큐에 추가된다.

메시지 큐(Queue)에 호출 메시지만 삽입하고 바로 블럭을 빠져나온다.(즉시 리턴)

이는 곧, 메시지 처리 결과와 상관없이 다음 코드를 진입한다는 뜻이다. (비동기)

 

활용

메시지 처리작업이 오래걸리거나 처리결과가 중요하지 않는 경우에 사용될거 같다.

반응형

시스템 맥주소를 가져와야할 필요가 있어서 관련 코드를 작성하고 컴파일 했는데

 

LNK2019 오류가 뜨면서 _GetAdaptersInfo@8 에러메시지가 나타난다.

 

이 경우에는 헤더파일만 추가해서 그렇다.

 

아래처럼 Lib파일도 추가해주면 된다.

#include <Iphlpapi.h>
#pragma comment (lib, "Iphlpapi.lib")
반응형

프로그래밍을 하다 보면 코드의 일부 내용을 반복적으로 바꿔줘야할 때가 있다.


오래된 프로젝트를 리팩토링한다거나 프로젝트 문자셋을 멀티바이트에서 유니코드로 바꿀 때가 그 대표적인 예다.


물론 일일이 컴파일 오류나는 부분을 찾아서 바꿔주거나 전체 찾기해서 바꿔주는 원초적인 방법이 있다.


보다 효율적이고 능률적인 방법을 소개하겠다.


바로 정규표현식(aka. 정규식)을 사용한 찾기 및 바꾸기이다.


C++에서는 정규식이 조금 낯설수 있는데, 간략하게 설명하자면 정규표현식이란, 문자열에서 일정한 규칙(Pattern)을 갖는 문자열 집합(Group)을 찾아내는 것이다.


필자는 멀티바이트로 작성된 프로젝트를 유니코드로 바꾸는 과정에서 수많은 문자열 메시지 부분을 유니코드에 맞게 바꾸줘야하는 작업을 위 정규식을 이용해 작업했다.


찾기 바꾸기 대화상자(단축키:Ctrl+Shift+F)에서 찾기옵션에 정규식 사용에 체크를 해야한다.



MFC의 대표적인 문자열 타입인 Cstring의 경우 멀티바이트 인 경우 큰따옴표("")로 문자열을 표시했지만,


유니코드로 바꾸려면 _T 매크로를 넣어주거나 L를 앞에 넣어줘야한다.


물론 _T 매크로가 삽입되어 있다면, 매크로에서 자동으로 L로 변환이 된다.


(멀티바이트든, 유니코드는 _T 매크로를 넣어주는 버릇을 갖다.)


_T매크로는 _T(로 시작해서 괄호) 로 끝나기 때문에 그냥 찾아 바꾸기만 해서는 안된다.


다음은 내가 가장 많이 쓰는 정규식이다.



1. Cstring의 Format 멤버함수

예시:


찾을 대상

strTitle.Format("%s: ABCDEFG123456가나다라", this->getTitle());


바꿀 문자열

strTitle.Format(_T("%s: ABCDEFG123456가나다라"), this->getTitle());

Format 멤버함수의 문자열을 감쏴고 있는 큰따옴표 앞에 _T 매크로를 넣어줘야한다.


정규표현식:


찾을 문자열:

.Format\(\"(.*)\"


바꿀 문자열

.Format(_T("$1")

위에서 보다시피 정규식을 찾을때에는 문자열에 포함되는 괄호, 따옴표에 대해서는 백슬래시(\)로 구분을 해줘야한다.

그리고 바꿀 문자열에 대해서는 백슬래시가 필요없으며 그룹 문자열($1,$2,$3...) 등을 사용하면 된다.



2. Afxmessage 메시지 팝업

예시:

찾을 대상

AfxMessageBox("입력값 초과");


바꿀 문자열

AfxMessageBox(_T("입력값 초과"));


정규표현식:


찾을 문자열:

AfxMessageBox\(\"(.*)\"


바꿀 문자열

AfxMessageBox(_T("$1")


반응형

Worker 쓰레드나 UI쓰레드에서 UI 객체를 바로 접근하는것은 매우 위험하다.


컴파일러에 따라서 오류를 발생시키는 경우도 있지만 


컴파일러가 이를 못잡아준 경우에는 해당 쓰레드가 실행되면서 UI접근시 Assertion fail 오류가 발생하면서 죽게된다.


쓰레드에서 UI를 직접 접근하는 방법은 몇가지가 있으나 불편하고, 안정적이지 못하다.


가장 안전하면서 API 프로그래밍 특성인 메시지를 이용하는 방법을 추천한다.


사용자 메시지를 만들어서 PostMessage를 통해 넘겨서 UI를 접근할 수 있다.


물론 Param에 인자값 까지 넘겨서 사용할 수 있다.


::PostMessage(*phObjectHandle, WM_UPDATE_UI, 0, 0);



관련 내용 : http://forums.codeguru.com/showthread.php?312454-MFC-Thread-How-to-access-UI-elements-from-a-thread-in-MFC

반응형

C++에서 XML 문서를 파싱하거나 생성해야할 때가 있다.


물론 DOM형식이지만 텍스트 파일에서 보이므로 하나씩 토크나이징하면서 하나하나 파싱하는 방법도 있겠지만


필요이상의 작업이 들어가고 속도도 느리다.


따라서 Paser를 이용하여 쉽고 빠르게 문서 내용을 파싱해야한다.


C++에서는 기본적으로 제공하는 클래스가 없다. ㅠㅠ (C#이 왜 강려크한지 그 이유..)


오픈소스를 찾아보니 CMarkup이라는 클래스가 있다.


사이트에 들어가 다운받으면 아래와 같은 두 파일이 보인다.


Markup.cpp 

Markup.h

위 두 파일을 프로젝트에 추가시키고


 #include "Markup.h"



CMarkup xml;

bool bSuccess = xml.Load( "C:\\Temp\\hello.xml" ); 

이런식으로 CMarkup 클래스 생성해서 사용하면 된다.


홈페이지에 상세 API가 잘 되어 있으니 참고해서 활용하면 될듯하다.


+ Recent posts