'MSDN'에 해당되는 글 2건

  1. 2010.02.10 GetLastError() 함수 (2)
  2. 2010.02.08 64비트 기반 프로그래밍
Windows 시스템 함수를 호출하는 과정에서 오류가 발생하면

NULL을 리턴하지만 그 원인은 파악할수 없다.

원인을 파악하기 위해서는

시스템 함수뒤에 GetLastError 함수를 호출하여
 
그 함수의 오류에 해당하는 에러 코드를 리턴(정상일시 0 리턴)받아서

이를 MSDN 에서 참조해야 한다.

하지만 여기서 더 나아가

에러 코드를 해석해 문자열로 만들어주는 함수를 사용한다면 MSDN 을 참조하는 번거로움을 덜 수 있다.



예제 소스 :

1. 에러 코드 확인

_tprintf(_T("Error Code : %d\n"), GetLastError());


2. 에러 코드를 해석한 문자열 확인

#include <atlstr.h>

CString PrintErrorMessage(DWORD err)
{
       LPTSTR lpMsgBuf;
       CString msg;
       FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER   // 에러코드 해석 함수
                             | FORMAT_MESSAGE_FROM_SYSTEM
                             | FORMAT_MESSAGE_IGNORE_INSERTS,
                             NULL, err,
                             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                             (LPTSTR)&lpMsgBuf, 0, NULL);
     msg = lpMsgBuf;
     LocalFree(lpMsgBuf);
     return msg;
}


사용법 : MessageBox(NULL, PrintErrorMessage(GetLastError()), "Error", MB_OK);

'Windows > _Windows Programming' 카테고리의 다른 글

구조적 예외처리(SEH)  (0) 2010.03.08
GetLastError() 함수  (2) 2010.02.10
Mstsc(원격) 사용하기  (4) 2010.02.06
리소스(Resource)  (0) 2009.12.24
윈도우 프로그램 기본 틀  (0) 2009.12.23
윈도우 관리 메시지  (0) 2009.12.23
Posted by Dakuo

1. 64비트와 32비트

구분 :
 
1. I/O BUS를 통해서 한번에 송 · 수신할 수 있는 데이터 크기

2. 데이터 처리능력


32비트 -> 64비트 :

1. 더 넓은 메모리 공간(가상 메모리) 활용(32비트 : 표현할수 있는 주소 4GB -> 64비트 : 표현할수 있는 주소 16TB)

2. 연산속도의 증가(32비트 : 최대 32비트 데이터 처리 --> 64비트 : 최대 64비트 데이터 처리)



2. 64비트 기반 프로그래밍

1) LLP64, LP64 :

 운영체제  모델  char  short  int   long   포이터
 Windows  LLP64  1바이트  2바이트  4바이트  4바이트  8바이트
 UNIX  LP64  1바이트  2바이트  4바이트  8바이트  8바이트

Windows에서는 포인터만 8바이트로 표현함으로써 32비트 시스템과의 호환성을 중시한다.


2) 64비트와 32비트 호환의 문제점 :

64비트 시스템에서는 포인터가 8바이트 이므로 int, long 등 정수형 데이터로 변환하게 되면 4바이트의 데이터 손실이 발생한다.
(하지만 변환하고자 하는 포인터가 4GB안에 있으면 4바이트로도 표현이 가능하므로 데이터 손실이 발생하지 않는다)


3) 64비트 표현 Windows 스타일 자료형 :

 WINDOWS 자료형  의미  정의 형태
 BOOL  Boolean variable  typedef int BOOL
 DWORD  32-bit unsigned integer  typedef unsigned long DWORD;
 DWORD32  32-bit unsigned integer  typedef unsigned int DWORD32
 DWORD64  64-bit unsigned integer  typedef unsigned __int64 DWORD64
 INT  32-bit signed integer  typedef int INT;
 INT32  32-bit signed integer  typedef signed int INT32
 INT64  64-bit signed integer  typedef signed __int64 INT64
 LONG  32-bit signed integer  typedef long LONG
 LONG32  32-bit signed integer  typedef signed int LONG32
 LONG64  64-bit signed integer  typedef signed __int64 LONG64
 UINT  Unsigned INT  typedef int UINT
 UINT32  Unsigned INT32  typedef unsigned int UINT32
 UINT64  Unsigned INT64  typedef unsigned __int64 UINT64
 ULONG  Unsigned LONG  typedef unsigned int ULONG
 ULONG32  Unsigned LONG32  typedef unsigned int ULONG32
 ULONG64  Unsigned LONG64  typedef unsigned __int64 LONG64
 PINT  INT에 대한 포인터  typedef int* PINT
 PINT32  INT32에 대한 포인터  typedef signed int* PINT32
 PINT64  INT64에 대한 포인터  typedef signed __int64* PINT64


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

(참고 : 64비트 기반 프로젝트 구성시 _WIN64 매크로는 는 자동으로 삽입된다
          32비트 기반 프로젝트 구성시 _WIN32 매크로 자동 삽입)


5) 실제 적용 :

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

UINT_PTR CalDistance(UINT_PTR val1, UINT_PTR val2);

int _tmain()
{
        INT_PTR num1 = 10;
        INT_PTR num2 = 20;

       _tprintf(_T("Distance : %d UINT_PTR SIZE : %d \n"),
                CalDistance((UINT_PTR)&num1, (UINT_PTR)&num2), sizeof(num1));

        return 0;
}

UINT_PTR CalDistance(UINT_PTR val1, UINT_PTR val2)
{
          return val1 - val2;
}

sizeof에 의해서 컴파일 환경이 몇비트인지 알수 있다.

Posted by Dakuo