=========fileDSN.dsn
[ODBC]
DRIVER=SQL Server
UID=testid
DATABASE=testDb
PWD=passwd
APP=Microsoft Data Access Components
SERVER=testserver
=========

// 소스
#pragma comment(lib, "odbc32.lib")
#include <iostream>
#include <Windows.h>
#include <sql.h>
#include <sqlext.h>

using namespace std;


void DsnQuery()
{
    //////////////////////////////////////////////////////////////////////////////////////
    // start
    SQLHENV hEnv;
    // 환경 핸들을 할당하고 버전 속성을 설정한다.
    if( SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv ) != SQL_SUCCESS )
        return;

    if( SQLSetEnvAttr( hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER ) != SQL_SUCCESS )
        return;

    // 연결 핸들을 할당하고 연결한다.
    SQLHDBC hDbc;
    if( SQLAllocHandle( SQL_HANDLE_DBC, hEnv, &hDbc ) != SQL_SUCCESS )
        return;

    SQLCHAR connectInfo[256] = { 0, };
    wsprintf( (char *)connectInfo,  "FILEDSN=.\\fileDSN.dsn" );
    SQLCHAR outInfo[256] = { 0, };
    SQLSMALLINT sqlRet = 0;
    SQLRETURN ret = SQLDriverConnect( hDbc, NULL, connectInfo, sizeof( connectInfo ), outInfo, sizeof( outInfo ),
        &sqlRet, SQL_DRIVER_NOPROMPT );

    if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) {
        cout << "ERROR : INI Table을 가져올수 없습니다.\n";
        return ;          
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // 명령 핸들 할당. 및 바인딩.
    // 명령 핸들을 할당한다.
    SQLHSTMT hStmt;
    SQLAllocHandle( SQL_HANDLE_STMT, hDbc, & hStmt );

    // 결과를 돌려 받기 위해 바인딩한다.
    SQLCHAR iniTablename[64];
    SQLLEN lIniTablename;
    SQLBindCol( hStmt, 1, SQL_C_CHAR, iniTablename, sizeof(iniTablename), &lIniTablename );

    // SQL문을 실행한다.
    SQLExecDirect( hStmt, (SQLCHAR *)"select name from test_table where name like 'test%' order by name", SQL_NTS );
    while( SQLFetch( hStmt ) != SQL_NO_DATA ) {
        cout << reinterpret_cast<char *>( iniTablename )  << endl;
    }

    SQLCloseCursor( hStmt );
    SQLFreeHandle( SQL_HANDLE_STMT, hStmt );

    //////////////////////////////////////////////////////////////////////////////////////
    // clean up
    SQLDisconnect( hDbc );
    SQLFreeHandle( SQL_HANDLE_DBC, hDbc );
    SQLFreeHandle( SQL_HANDLE_ENV, hEnv );
}

int _tmain(int argc, _TCHAR* argv[])
{
    DsnQuery();
    return 0;
}




_mbsbtype : 해당 글자가 Single byte인지 멀티바이트 시작문자인지 멀티바이트 끝문자인지 알아낸다.

사용예제
 
#include <mbctype.h>
#include <mbstring.h>

int main(int argc, char* argv[])
{
    const unsigned char    str[] = "hello 헬로우 월드";
  _setmbcp( 949 ); // 한글 윈도우에서는 codepage를 설정할 필요가 없다.
    for( int i = 0 ; i < sizeof( str ) ; ++i ) {

        switch( _mbsbtype( str , i ) ) {
        case _MBC_SINGLE:     // 싱글 바이트
            printf( "1 : [%c]\n", str[i] );
            break;
        case _MBC_LEAD:        // 멀티 바이트 헤더
            printf( "2 : [%c", str[i] );
            break;
        case _MBC_TRAIL:        // 멀티 바이트 테일
            printf( "%c]\n", str[i] );
            break;
        case _MBC_ILLEGAL:     // 알수 없는 문자.
            break;
        default:
            break;
        }
    }
   
    return 0;
}


출력결과
1 : [h]
1 : [e]
1 : [l]
1 : [l]
1 : [o]
1 : [ ]
2 : [헬]
2 : [로]
2 : [우]
1 : [ ]
2 : [월]
2 : [드]


offsetof은 클레스나 구조체에 있는 member 위치를 알려주는 키워드다.

일단 소스와 결과를 보라.

#include <iostream>
using namespace std;

struct sA
{
    int a;
    double b;
    short c;
    short d;
    int e;
};

int main()
{
    cout << "sizeof(sA) : " << sizeof(sA) << endl;
    cout << "offsetof(sA::a) : " << offsetof(sA, a) << endl;
    cout << "offsetof(sA::b) : " << offsetof(sA, b) << endl;
    cout << "offsetof(sA::c) : " << offsetof(sA, c) << endl;
    cout << "offsetof(sA::d) : " << offsetof(sA, d) << endl;
    cout << "offsetof(sA::e) : " << offsetof(sA, e) << endl;
    return 0;
}
출력)

sizeof(sA) : 20
offsetof(sA::a) : 0
offsetof(sA::b) : 4
offsetof(sA::c) : 12
offsetof(sA::d) : 14
offsetof(sA::e) : 16

그럼 설명 하겠지만 엉성하다.
struct sA
{
    int a;
    double b;
    short c;
    short d;
    int e;
};
위 코드에서
32bit머신에서

int a 크기는 4byte.
double b 크기는 8byte.
short c 크기는 2byte.
short d 크기는 2byte.
int e 크기는 4byte 이다.

sizeof( sA ) 를 하면.
출력값이 4+8+2+2+4 = 20이 나올것이다.

cout << "sizeof(sA) : " << sizeof(sA) << endl;

출력)
$ ./sizeof
sizeof(sA) : 20

그러면 a위치가 어디인지 아는 방법은 없을까?
방법은 있다. offsetof라는거다.

a위치는 0번째부터 3번째까지일테고
b위치는 4번부터 11번째 위치.. 이렇게 될것이다.

자 그럼 어떤 원리일까?
offsetof를 따라가 보면 아래와 같은 소스가 나온다.
#define offsetof(s,m) (size_t)&(((s *)0)->m)
무슨뜻일까?ㅡ.ㅡ

offsetof(sA, b) 를 대입 해보자
(size_t)&(((sA *)0)->b)
아 머리 아프다.

아래걸 보자.
((sA *)0)
무슨뜻일까?
0번지 주소값에 sA가 있다고 가정하는것이다.
결론은 0...

여기서 ->b를 넣었다.
(0)->b

움. 무슨뜻?
컴퓨터는 메모리를 접근할때 기본 주소에 해당 멤버의 offset을 더해서 나머지 값들을 구한다.
결국 위의 것은

(0)->b 는
0 + (b의 위치) 가 된다.
결국
0+4 = 4
설명이 엉성하므로 아래 사이트를 보는것도 좋다.

http://kldp.org/node/62717
  • class

    • 멤버 변수명 작명

      • m_ 로 시작한다.
    • 멤버 함수명 작명

      • private : _소문자
      • protected, public : 대문자
    •  클래스명

      • 첫문자는 대문자명으로
    • 멤버변수 위치 

      • 하단, public/protected/private

  • struct

    • struct 작명

      • s로 시작 ( Ex. sCar )
      • 멤버 변수 작명 

        • m_ 제외
  • 지역변수명

    • 소문자로 시작.

      • 예제   int i; int j; Car pony; 
  • 전역 변수

    • g_로 시작 
  • 일반 함수 선언

    • 첫문자가 대문자 
  • define

    • 모두 대문자. DF_로 시작( 예외인정 ) 
  • 프리컴파일러

    • #ifdef _TEST
      #   ifdef _TEST111
      #   endif // _TEST111
      #endif // _TEST 
  • 파일명

    • 클래스명이나 struct 명과 동일( 예외인정 ) 
  • 주석

    • 파일 doxygen 주석 참고? 우선 맘대로 
  • 중괄호

    • 되도록 아래로 

이 글은 스프링노트에서 작성되었습니다.

 

 스트래티지 패턴(Strategy patten)

알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할수 있도록 만든다. 스트래티지을 활용하면 알고리즘을 사용하는 클라이언트놔는 독립적으로 알고리즘을 변경 시킬수 있다.

예제) 오리 - 나는 오리, 못나는 오리, 꽥꽨 거리는 오리, 삑삑 소리지르는 오리등..

 

옵져버패턴(Observer pattern)

한 객체의 상태가 바뀌면 그 객체에 의족하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다의 의족성을 정의 합니다.

예제) 출판사와 구독자, 헤드헌터와 개발자.

 

데코레이터 패턴(Decorator patten)

객체에 추가 요소를 동적으로 더할수 있습니다. 데코레이터를 사용하면 서브 클래스를 만드는 경우에 비해 훨씬 유연하게 기능을 확장할수 있습니다.

예제) 스바버즈 커피점의 음료와 각종 양념등등의 가격 개산 문제.

 

팩토리 패턴(Factory patten)

 팩소리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클레스에서 결정하게 만듭니다. 택토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것이죠.

예제) 피자가계에서 뉴욕스타일, 캘리포니아스타일, 시카고스타일 피자 만들기.

 

 프록시 패턴(Proxy patten)

어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴.

이 글은 스프링노트에서 작성되었습니다.

 

다국어 IME 분석 문서

IME_분석.pdf

 

다국어 IME 예제 소스

DefIme.zip

조합 중인 문자 취소 시키기

const HIMC hIMC = ::ImmGetContext( m_hWnd );
ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
::ImmReleaseContext( m_hWnd, hIMC );

 

조합 중인 문자 가져오기

if(lParam&GCS_COMPSTR) {

const HIMC hIMC = ::ImmGetContext( m_hWnd );

int tempSize = ImmGetCompositionStringW(hImc, GCS_COMPSTR, NULL, 0);

char *pBuf = (char *)malloc(tempSize );

ImmGetCompositionStringW(hImc, GCS_COMPSTR, pBuf, tempSize);

ImmReleaseContext(m_hWnd, hImc);

}

조합이 완성된 문자 가져오기

if(lParam&GCS_RESULTSTR) {

const HIMC hIMC = ::ImmGetContext( m_hWnd );

int tempSize = ImmGetCompositionStringW(hImc, GCS_RESULTSTR, NULL, 0);

char *pBuf = (char *)malloc(tempSize );

ImmGetCompositionStringW(hImc, GCS_RESULTSTR, pBuf, tempSize);

ImmReleaseContext(m_hWnd, hImc);

}

조합 윈도우 위치 설정하기

void SetIMECompPos( int xpos , int ypos )
{
    HIMC hImc = ImmGetContext(m_hWnd);
    if( hImc )  {
        COMPOSITIONFORM cf;
        cf.dwStyle = CFS_POINT;

        cf.ptCurrentPos.x = xpos;
        cf.ptCurrentPos.y = ypos;

        ImmSetCompositionWindow(hImc, &cf);
        ImmReleaseContext(m_hWnd, hImc);
    }
}

이 글은 스프링노트에서 작성되었습니다.

  1. C++ 기초 문법책을 본다.
    1. 열혈강의 C++ 프로그래밍 , 프리렉 , 윤성우
    2. Accelerated C++ : 예제로 배우는 진짜배기 C++ 프로그래밍
  2. 디자인 패턴책을 본다.
    1. Head First Design Patterns 를 보고 이를 한번 적용한 케이스를 찾아본다.
    2. 직접 사용도 해본다.
  3. C++ 응용책
    1. Effective STL, Effective C++
    2. The C++ Programing Language
  4. 기타 도움을 줄만한 책
    1. 운영체제 기초책

위책은 순수하게 C++를 배우는 책들이며..

여기에 열혈강의 C++ 프로그래밍 책을 다음부터는
자기가 배워야 할 분야의 책을 동시에 보기를 봐야 할거라고 생각합니다.

한번에 이해할려고 하지말고 여러번 보고 이해하는것이 방법인것 같습니다.

배우는 기간은 3년이상으로 생각합니다.
http://www.leechen.net/bbs/zboard.php?id=0_lecture&no=421

http://www.winapi.co.kr


+ Recent posts