Wide Char 와 ANSI 사이의 변환을 간편하게 해주는 매크로입니다.
 매크로 인자 결과 
 A2CW  LPCSTR  LPCWSTR 
 A2W  LPCSTR   LPWSTR
 W2CA  LPCWSTR  LPCSTR
 W2A  LPCWSTR  LPSTR
 T2COLE  LPCTSTR  LPCOLESTR
 T2OLE  LPCTSTR  LPOLESTR
 OLE2CT  LPCOLESTR  LPCTSTR
 OLE2T  LPCOLESTR  LPCSTR

예)
USES_CONVERSION;

TCHAR widechar[]=L"sample";
char ansichar[10];
ansi = w2a(widechar);
Posted by 빨강토끼

댓글을 달아 주세요

둘다 이벤트아이디에 따라 분기하는것은 같으나

GetMessage() 는 이벤트가 들어올때까지 내부적으로 loop를 돌며 기다립니다.
이와 반대로 PeekMessag() 는 이벤트가 있나보고 없으면 다음 코드로 넘겨버린다.

인터넷을 찾아보니 어떤분은 이 이유로 PeekMessage 를 사용하는것이 GetMessage를 사용하는것 보다
효율적이라고 말을 합니다.
http://mygeni.tistory.com/60

딴지를 걸려고 링크를 건건 아니구요.^^

참고 하시라구요...
Posted by 빨강토끼

댓글을 달아 주세요

GlobalAlloc

프로그래밍/C++ 2009. 2. 3. 11:51
소스를 분석하다가 GlobalAlloc() 라는 함수를 보았습니다.
이게 어디에 쓰는 물건인고? 하니
Heap 메모리 할당을 위한 함수였다. 아니 이런 10년 전에나 쓰던함수(정말이다.)를
보게 되다니...

하지만 하위호환성을 위해서나 클립보드,DDE,커스텀 리소스에서는 이함수를 쓰고 있다고 합니다.


대충 이런식으로 쓰입니다.

GlobalAlloc() 의 구조는 아래와 같습니다.

' wFlags : 메모리 할당 방법
' dwBytes : 할당 공간(Byte)
Private Const GMEM_MOVEABLE = &H2                       '## 이동 가능한 메모리 할당
Private Const GMEM_ZEROINIT = &H40                      '## 메모리 내용 초기화
Private Const GMEM_DISCARDABLE = &H100                  '## 삭제 가능한 메모리 할당
Private Const GMEM_FIXED = &H0                          '## 고정 메모리 할당
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)

Private Declare Function GlobalAlloc Lib "kernel32" ( _
                                               ByVal wFlags As Long, _
                                               ByVal dwBytes As Long) As Long

Posted by 빨강토끼

댓글을 달아 주세요

만약에 123456789 라는 숫자를 123,456,789 라는 식으로 표현하고 싶다면
사용할수있는 API 함수가 바로 GetNumberFormat 입니다.

네이버등을 통해서 검색해보면 사용법을 알수가 있는데
무작정 사용하는 것 보다는 좀더 옵션에 대하여 알아야 될것 같아서 정리해봅니다.

void InsertComma(double parm_num, char parm_buffer[])
{
    CString str;
 
    str.Format("%f", parm_num);
    NUMBERFMT fmt = {0, 0, 3, ".", ",", 1};

    // GetNumberFormat의 인자는 LOCALE_SYSTEM_DEFAULT, 플래그, 문자열 숫자, 문자열 포맷,
    // 변환된 문자열 숫자, 버퍼 사이즈이다.
    ::GetNumberFormat(NULL, NULL, str, &fmt, parm_buffer, strlen(parm_num));
}

소스출처 : http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=235&page=5

NUMBERFMT 의 구조는 아래와 같습니다.
Type NUMBERFMT
 NumDigits As Long
LeadingZero As Long
Grouping As Long
lpDecimalSep As String
lpThousandSep As String
NegativeOrder >As Long
End Type

NumDigits
  : 소숫점이하를 표시할 자릿수

LeadingZero
 
: 만약에 0라면 NumDigits 에서 선언한 자리수에 0 을 채워넣지않고 만일 0 이외의 값이라면
    0을 채워넣는다. (예를 들어 NumDigits 가 3이고 숫자가 1.23 이라면 그리고 LeadingZero 가
    0이라면 1.23 이라고 변환 될것이고 만일 LeadingZero 가 0 이외의 값이라면 1.230 이라고
    변환 될것임)

Grouping
  : 구분할 단위값을 정의합니다. 일반적으로 3을 사용하고 1,234,567 라고 변환된다. 0~9 까지 가능하다.

lpDecimalSep
  : 소숫점을 표현할 character 를 정의한다.

lpThousandSep
  : 단위 구분자를 표현할 character 를 정의한다.

NegativeOrder
  : 음수값을 변환하는 방법을 정의한다.
  예) -11.1
   0 일 경우 11.1
   1 일 경우 -11.1
   2 일 경우 - 11.1 ( - 다음에 space 를 삽입한다.)
   3 일 경우 11.1-
   4 일 경우 11.1 - ( - 전에 space 를 삽입한다.)

참조 : http://www.codebible.com/APIGuide/ref/numberfmt.asp
Posted by 빨강토끼

댓글을 달아 주세요

예전에 findwindow 를 통해서 특정 프로그램이 실행하지는 여부를 판별하는 법에 대하여
정리 했었습니다.

findwindow 사용법(VB , C++)


이것을 응용하여 중복실행을 방지하는 부분도 코딩을 하곤 했었는데
더 괜찮은 방법이 있으서 정리합니다.

바로 Mutex(뮤텍스) 입니다.

Mutex는 커널 오브젝트로 프로세스 핸들을 가집니다. (HANDLE)
주로 CriticalSection(크리티컬섹션)과 Semaphore(세마포어), 그리고 이벤트기법 과 함께
쓰레드등의 동기화 기법중 하나로 사용합니다.

뮤텍스는 이름을 가질수가 있는데 그로인하여서
  • 프로세스간에도 사용 가능합니다.
  • 크리티컬 섹션보다 우월합니다. -> 대신 그만큼 속도는 느림니다.--; (커널 오브젝트이기 때문에)
뮤텍스는 두 쓰레드가 동시에 소유할 수 없고 한 처음엔 signaled 이다가 쓰레드가 가지면
Non-signaled(비신호) 상태가 됩니다.

더깊은 얘기는 인터넷을 검색해보시기 바랍니다.
이글을 Mutex에 대한 설명보다는 Mutex를 이용하여 중복실행을 방지하는 법을 소개하겠습니다.

일단 함수 몇개를 소개하겠습니다.

뮤텍스 생성 합니다.



사용예



정리하고 나니깐 너무 간단하네요..ㅡㅡ;

findwindow() 등을 통한 방법과 비교해서 장점이라면
윈도우 클래스나 캡션은 중복 가능성이 많지만 뮤텍스는 이름을 복잡하게 주면 중복을 피할 수 있습니다.

마지막으로 뮤텍스 이름은 대소문자를 구분합니다.
대충 여러분이 만드시는 소스에서 어느부분에 어떻게 쓰실건가는 여러분이 알아서 쓰실거라 생각됩니다.
Posted by 빨강토끼

댓글을 달아 주세요

  1. . 2012.03.06 21:35  댓글주소  수정/삭제  댓글쓰기

    CloseHandle(hMutex)가 빠졌네요.

1. 이식성이 강하다 : 새로운 프로그램에 대한 강력한 이식성은 개발기간을 단축시킨다.
2. 유연성이 있다 : 컴으로 작업한 소프트웨어를 업그레이드 하고자 할 경우 단순히 업그레이드된 컴포턴트만 복사하면 되고 업그레이드 되지 않은 컴포넌트를 사용하지 않은 경우에도 잘 수행된다.
3. 재 컴파일할 필요가 없다.
4. 객체지향 개발 방법론(com) 은 프로그램의 구현방법을 획기적으로 바꾸었다.
5. com 의 경우 플랫폼에 독립적이다.
Posted by 빨강토끼

댓글을 달아 주세요

  1. 미친과학자 2009.01.08 20:10  댓글주소  수정/삭제  댓글쓰기

    COM의 단점 :
    1. 이해하려면 머리에 쥐가나며
    2. ATL 없이 개발하는 사람은 굇수나 다름없고
    3. 데이터 인자의 교환이 골치아픕니다.

  2. 빨강토끼 2009.01.09 14:23  댓글주소  수정/삭제  댓글쓰기

    네 맞습니다. 어렵고 까다롭지요...
    제가 그걸 예전엔 왜 개발했는지...
    정말 무식하면 용감하다라는게 맞나봅니다.

    하지만 전 몇년전에 삼성전자에서 COM으로 빌링등 솔루션을 만들었었고
    지금도 잘 동작하고 있습니다.^^;

    덕분에 저의 스킬도 많이 발전했구요.

    .net 이나 프레임워크가 (WCF 등) 이 아무리 발전해도 COM 못버리는 이유는
    어려운만큼 강력함을 가지고 있다는겁니다.

    COM으로 어느정도 엔터프라이드 개발환경에 경력이 생기고 경험이 있다면
    몸값도 상당히 올라갑니다.^^

  3. 미친과학자 2009.01.09 14:23  댓글주소  수정/삭제  댓글쓰기

    전 개인적으로 COM이 강력하다기 보다는 COM을 수용하는 .net이 더 강력해 보입니다 OTL

    그나저나 아직 COM을 엔터프라이즈 환경에서 많이 쓰나보군요. 한때는 정말 열심히 했었는데. ㅡㅡ;

요즘 COM에 관심을 가져보고 있는데.

나의 COM(Component Object Model) 경험담 #1|작성자 저격수

라는 블로그글이 있어서 재미있게 보고 있습니다.
아직 다본게 아니라서 좋다 나쁘다를 평가하긴 머하지만

5번째 글중에 이미지가 깨져서 랜덤하게 새로운 GUID 를 생성하는 부분이
보이지 않아서 인터넷으로 찾아봤습니다.

윈도우의 실행에서 guidgen 이라고 입력하고 실행하면
해당 프로그램이 실행하여 새로운 guid 를 구하실수있습니다.

분명 몇년전에 COM관련 프로젝트를 했었는데 그땐 이런툴이 있는지도 몰랐는데
어떻게 COM을 만들었는지 모르겠습니다....--;

Posted by 빨강토끼

댓글을 달아 주세요

static 이란 정적변수로서 일반적인 변수와는 다르게 메모리 안에 계속 저장되어있습니다.
전역변수와 지역변수 앞에 static 키워드를 붙여서 선언할수있습니다.

전역변수에서 선언하면 프로그램이 실행될때 초기화되어 메모리에 알라가서
프로그램이 종료될때 사라집니다.

지역변수는 함수내에서 선언되면 메모리안에 저장되어 함수가 종료되어서도
사라지지않고 다시 함수를 호출시 그전의 값이 그대로 남아있어 사용할수있습니다.

예)
int a()
{
int a=1;
a+=1;
return a;
}

위와 같이 하면 함수를 호출할때마다 a = 2 를 반환합니다.
하지만,

int a()
{
static int a=1;
a+=1;
return a;
}

static int a=1; 는 한번만 실행되고 그후로부터 함수를 호출할때마다 1씩 증가된값을 반환합니다.
Posted by 빨강토끼

댓글을 달아 주세요

제목이 맞는지 모르겠습니다.
프로그래밍을 하다보면 자신의 부모 클래스에 다양한 이벤트와 위저드로 생성된
afx_msg 함수를 동작시켜야될때가 있습니다.
예를 들어 자식다이얼로그에서 종료버튼을 클릭하면 프로그램이 종료되거나.
특정한 이벤트를 받는 함수를 호출해야할경우 입니다.

GetParent()->SendMessage(이벤트ID)

예)
GetParent()->SendMessage(WM_CLOSE); // 종료시

GetParent()->SendMessage(WM_COMMAND, ID_BUTTON1); // 버튼1 클릭시


Posted by 빨강토끼

댓글을 달아 주세요

다이얼로그 프로그래밍을 하다보니
동적으로 다이얼로그의 사이즈를 조정해야될 필요가 있었습니다.

의외로 쉬운 방법이 있었습니다.

MoveWindow(Xmin,yMin,Xmax,yMax);

이상입니다.

Posted by 빨강토끼

댓글을 달아 주세요