티스토리 뷰

윈도우즈 시스템 프로그래밍에 관련된 내용입니다.

190701-1 - 커널오브젝트, 아스키코드와 유니코드
(1일차) 교육을 받으면서 노트필기 했던 내용을 날것 그대로 업로드합니다.
 

C/C++의 DLL등을 .Net에서 갖다가 그대로 쓸 수 있다.
(유명한 C++/C 라이브러리는 C#으로 포팅 되어있다.)
 
다른 언어를 사용할 때 BCL을 사용해야한다. (이론적으로 모든 언어로 프로그래밍이 가능하다. 그러나 거의다 C#으로 개발함)
Win32라이브러리에서 os와 밀접한 부분을 공부한다. 그 부분이 시스템 프로그래밍이다.
 여기서는 프로세스와 쓰레드, 핸들 종류, 메모리, DLL(동적 링크 라이브러리), 동기화 객체, +a 등을 중요하게 공부할 것이다.
 쓰레드와 동기화 부분은 다른 쪽으로 넘어가도 중요한 부분이 될 것이다. (메모리.. 부분은 RAM을 늘려가는 것으로 해결 등.)
 
BCL(기본 클래스 라이브러리)
 

 
윈도우 오브젝트 크게 3가지
  • 커널 오브젝트 : 프로세스. 지역+전역 핸들 개념이 포함되어있다. 한정적이라고 한다. (원할 때 꺼내서 사용이 가능하다.) (이후에 다시 정리하도록 한다.)
  • GDI 오브젝트 : CreatePen, Brush 등으로 만든 것들. 지역적 핸들 (해당 프로그램 내부에서만 사용가능, 다른 윈도우에선느 사용할 수 없다. 프로세스간 공유가 불가능하며 독립적으로 유지된다.)
  • 유저 오브젝트 : 사용자 Interface 오브젝트 : 대표적인 것이 Window, Cursor, icon 등이 있다. 전역적이다. 다른 윈도우 핸들을 알면 다른 프로그램에 메세지를 보낼 수 있다.
위 3가지를 핸들의 종류. 핸들의 종류는 위 세가지로 나누어진다.
 
● 커널 오브젝트
핸들은 컨트롤하는데 사용되고 ID는 구분하는데 사용이된다.
커널오브젝트는 ID와(문자열, 정수번호) 핸들을 갖게된다.
 
● 프로세스의 커널오브젝트는 OS에 만들어진다. 그리고 아이디가 할당이되고 바뀌지않는다. 다른 곳에서 어디든지 사용되도 상관없다. 그러나 컨트롤을 하기위해서는 핸들이 필요하다. B가 핸들(200번)을 얻었다고 그 핸들을 A에 그대로 보내도 A에서는 사용할 수 없다. 보안 때문에 그러하다. 다 접근 권한을 가지고 있다.
 그렇다면 어떻게 공유를 하는가? 바로 ID를 사용하는 것이다. ID로 핸들을 얻어야 유효한 정보가 들어오는 것이다. 핸들을 얻는 것을 보통 open해서 얻어온다라고 표현한다.
 
● 커널오브젝트는 ID->핸들 순으로 얻어와서 컨트롤 해야한다.
● 프로세스가 종료될때 종료 정보가 저장된다. 핸들만 있으면 종료코드를 읽어올 수 있다. 이미 살아있는 경우 Still Active값이 반환되서 알 수 있다.
 
● OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION, 0, GetCurrentProcessId());
아이디를 주고 핸들을 받는 부분.
첫 번째 인수 : 핸들을 어떻게 사용할지 용도
세 번째 인수 : 아이디
 
 
#include <stdio.h>
#include <windows.h>
void main()
{
    // 프로세스 ID, 핸들 출력
    printf("process ID : %d\n", GetCurrentProcessId());//●현재 프로세스의 아이디를 출력한다.
    printf("process Handle : %d\n", GetCurrentProcess()); // 프로세스 내에서만 사용 가능한 핸들 테이블에 등록되지 않는 핸들
    // ● GetCurrentProcess() 수도핸들 가짜 핸들이라고 생각하면된다. 0xffffff 등... 결론적으로 정수로는 -1이다.
    // ● 그래도 약속이기에 위 처럼 얻어온다.
    
    DWORD exitCode = 0;
    GetExitCodeProcess(GetCurrentProcess(), &exitCode); //● 종료 코드 값을 얻는다.
    //● main()에서 return 0; 에서 0부분이 종료코드에 해당한다.
    if(exitCode == STILL_ACTIVE)
        printf("프로세스가 사용 중~\n");
 
    //ID로 프로세스 핸들 얻기
    // PROCESS_QUERY_LIMITED_INFORMATION : GetExitCodeProcess() 호출 확인 위한 권한 설정
    HANDLE hProcess = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION, 0, GetCurrentProcessId());
    //● psudo 핸들이 아니라 정말 핸들이다. (핸들테이블에 등록되있기 때문)
    printf("Open Process 반환 핸들 : %x\n", hProcess );
 
    //프로세스 사용중인지 추적
    GetExitCodeProcess(hProcess, &exitCode);
    if(exitCode == STILL_ACTIVE)
        printf("프로세스가 사용 중~\n");
}
 
//● : 원본파일에 추가적으로 작성한 주석을 의미

●아스키코드와 유니코드에 대해서
C#, JAVA, Python 등 은 모두 문자코드를 유니코드로 사용한다. UTF-16이라는 인코딩 방식을 사용한다.
 
●ANSI(ASCII CODE)
컴퓨터는 영어문화권에서 만들어졌다. 처음에는 7bit 체계의 아스키 코드를 사용했다. (확장 1bit) 그러다 보니까 영어 문화권에서 사용하는 영문자는 모두 표기하지만 한글등은 표현이 어렵다. MS 쪽에서는 SBCS(1byte), DBCS(2byte), MBCS, WBCS 4가지를 사용했다. 한글은 2바이트 체계를 사용한다. 아스키에서 시작비트가 0이면 영문자. 1로시작하면 2byte이상의 문자를 의미한다. 윈도에서는 멀티바이트셋을 사용했다.
 
●UNICODE {Encoding
 이후 문자체계 표준이 정해진다. 그것이 바로 유니코드이다. 크기는 따로 업다. 문자의 정수를 부여해논 것 뿐이다. (Encoding) 
  • Encoding
    • UTF-8 (웹 default)
    • UTF-16 (유니코드하면 일반적으로 16)
    • UTF-32
인코딩은 메모리상에 원하는 비트를 만들어내는 기능이다. UTF-8 같은 경우 모두 다 8bit로 표기한다. UTF-16은 2byte이상의 문자코드이다. 전세계적으로 주로 사용되는 문자들이 있다. 65000자 정도를 수용한다. 대부분 문자들이 2byte내에 들어간다. UTF-32는 전세계 모든 문자를 표현할 수 있다. 모든 문자를 4바이트로 표현을 한다. 표준으로 일반적으로 선택한 것은 UTF-16방식을 사용한다.
 
MBCS(utf8), WBCS(utf16) 을 선택하여 컴파일할 수 있다. 영어권 애들은 후자사용하면 손해이다. 이때 MS에서 두 개를 변환할 수 있는 매크로 함수를 만들었다. 
 
● 위 옵션을 사용해서 컴파일 하겠다는 뜻이다. /D(Definition) 모든 파일에 Define _UNICODE, UNICOED 를 모든 파일에 define하겠다는 뜻이다. 해당 선언이 있냐 없냐에 따라서 코드를 2개로 분리시킬 수 있다.
    ● 'A' (1byte), 
 
    ● 위를 보관하기 위한 변수
 

● 둘 중 하나로 개발했다면 다 바꿔야한다.. 그래서 중간 형식을 만들었다. 알아서 바꿔주는 것을 만든 것이다. 바로 T형식
 
● _T(), T(), TEXT() 등 다 같은 것이다.
 
문자열을 사용하는 함수들은? -> 2개씩 만들어야 되겠다. -> 문자열을 받는 모든 함수는 2개씩 만들어졌다.. A자가 붙어있던가 W자가 붙어있던가
 
● WndClass.lpszClassName = "Window Class Name"; // 멀티바이트 사용한것이다. (유니코드는 _T) (또는 앞에 L자)
댓글
댓글쓰기 폼