본문 바로가기

C/C++

Process 생성 및 종료 * 프로세스 생성 + CreateProcess 함수를 사용하여 새로운 프로세스 생성 + CreateProcess함수는 새로 생성된 프로세스가 완전히 초기화되기 전에 TRUE 반환 - 운영체제의 로더가 새로운 프로세스가 필요로하는 dll을 로드하기 전에 TRUE를 반환하기 때문에, 페어런트 프로세스는 차일드 프로세스에 어떤 초기화 문제가 발생했는지 알 수 없음 + 새로운 프로세스를 만들면 시스템은 새로운 프로세스 커널 오브젝트와 스레드 커널 오브젝트를 생성 - 커널 오브젝트가 새롭게 생성되면 사용 카운트(usage count) 값이 1로 초기화 - CreateProcess 함수 반환 전, 프로세스 커널 오브젝트와 커널 오브젝트를 최대 접근 권한으로 한번 더 오픈 PROCESS_INFORMATION 구조체 .. 더보기
[펌] C/C++ Mixed Programming (name mangling) 아래 블로그를 통해 extern "C"의 정체를 알게 됐다. [펌] - http://yesarang.tistory.com/65 고절가주팁 두번째 시간입니다. 저번 글에서 말씀드린 대로 C/C++ 섞어 프로그래밍하기 기법에 대해 말씀 드리겠습니다. C/C++ 섞어 프로그래밍하기에 대해 글을 써 봐야겠다고 생각하게 된 건 다음 글 때문이었습니다. C에서 C++로 작성한 라이브러리 쓰기먼저 name mangling이라는것을 알아보았다. 하여튼 이넘때문에 C에서 C++에서 작성한 라이브러리를 사용하고 싶을때는 C++ 라이브러리를 작성할때 애초에 C에서 사용될수 있다는것을 염두해 두고 작성해야 한다는 말이다... 위 글을 읽고 났더니 옛날에 C/C++ 두 언어를 다 써서 개발을 해야 했던 기억이 나더군요. 그래서.. 더보기
프로세스 인스턴스 핸들 (Process Instance Handle) 인스턴스 핸들이란? 모든 실행 파일과 DLL 파일은 프로세스의 메모리 공간 상에 로드될 때 고유의 인스턴스 핸들을 할당 받는다. 이 인스턴스 핸들은 WinMain의 첫번째 매개변수인 hInstance를 통해 전달된다. 그리고 이 핸들 값은 다음과 같이 보통 리소스를 로드할 때 사용된다. HICON LoadIcon ( HINSTANCE hInstance, PCTSTR pszIcon); 많은 애플리케이션에서 WinMain의 hInstance 매개변수를 전역변수로 저장해 두고 사용한다. 아래와 같이 HMODULE형 인자를 요구하는 함수들이 있으며, HMODULE과 HINSTANCE는 완전 동일하다. (16비트 윈도우에서 구분되었지만 지금은 혼용) DWORD GetModuleFileName (HMODULE hI.. 더보기
Avoiding problems with VC2005 SP1 Security update KB971090 마이크로소프트가 VS2005 의 KB971090 업데이트를 쥐도새도 모르게 설치해준다. 처음에는 VS2005가 설치되어 있지 않는 컴퓨터에서는 컴파일된 바이너리를 아래의 재배포패키지를 통해 실행해었다. http://www.microsoft.com/downloads/details.aspx?familyid=200b2fd9-ae1a-4a14-984d-389c36f85647&displaylang=en 그러나, KB971090 업데이트후에 실행되지 않는 문제 발생!!! 프로그램 추가/삭제 에서 KB971090 업데이트를 삭제하고 컴파일 하니까 실행은 된다만, 또 어느순간보면 KB971090 가 설치되어 있다. 결국, 아래의 재배포패키지를 설치해야 한다. http://www.microsoft.com/download.. 더보기
[펌]비주얼베이직(VB)에서 마우스 스크롤이 되는 방법 비주얼 베이직 6.0에서 작업을 하다보면 뜻밖에도 이런 것이 안 되다니 하고 느끼는 것이 있다. 바로 마우스의 휠이 먹히지않는다는 것이다. 마우스로 화면을 스크롤할 수 없다는 것은 정말이지 뜻밖의 복병이다. 윈도우에서 아무런 문제 없이 사용하던 것이비주얼베이직에만 오면 딱 그 기능이 멎어버린다. (놀라운 MS사의 센스가 아닐 수 없다!)이 문제를 해결하려고 하면 아래의 파일을 내려받아서 설치하면 간단하게 해결된다.(왜 이것은 VB6에 기본적으로 포함하지않는 것도 이상하다. 더군다나 패치에서도 해결할 노력이 없다. SP6까지 오면서 개선된 것이 없다. 다행히도 VB.NET에서는된다.) 1. 아래의 파일을 내려받는다. http://download.microsoft.com/download/e/f/b/efb39.. 더보기
[MFC] VC++이 생성하는 파일 NL 인라인 함수 파일. 이 파일에는 인라인 함수가 정의된다. RC와 RC2 RC는 리소스 파일을 말하며 리소스 컴파일러(RC.EXE)에 의해 컴파일된다. 다 이얼로그, 아이콘, 메뉴, 커서 등과 같은 리소스에 대한 정보가 기술되어 있다. RC2 또한 리 소스에 대한 정보가 포함된다. DEF 모 듈 정의 파일(Module definition file). 프로젝트 유형에 따라 사용목적이 다른데 윈도우즈 또는 윈도우즈 NT 기반의 프로그램인 경우 익스포트되는 함수의 리스트, 힙(Hea p)크기, 세그먼트 속성 등을 지정한다. APS 리소스 파일에 대한 바이너리 파일. App Studio에서 리소스 파일을 로딩하는데 사용(로딩 속도 향상) BSC 소스 브라우저 정보 파일(Browser database file.. 더보기
bstr , CComBSTR 통상적인 WIN32에서는 BSTR도 WCHAR*입니다. 통상적으로 쓰는 WCHAR 문자열과 다른 점은, 첫문자 앞에 4바이트가 추가로 할당되어 문자열의 길이를 저장합니다. 문자열크기(4바이트)첫번째 문자(2바이트)두번째 문자(2바이트)세번째 문자(2바이트)NULL(2바이트) 이런 구조이구요, BSTR 자체는 WCHAR*로, 첫번째 문자의 주소를 가리키고 있는 포인터입니다.보통 메모리를 할당하면, 가장 첫번째 요소의 주소를 가지고 핸들링 하는데,BSTR은 약간 특이하게 문자열의 크기가 아니라 첫번째 문자의 포인터입니다.그래서 C언어에서 사용할 때, 통상적인 WCHAR*과 비슷하게 사용할 수 있긴 하죠. 조금 헷갈릴 수 있는 게 C언어에서 메모리를 할당하거나 해제할 때는 가장 첫번째 요소의 포인터를 사용하는.. 더보기
[펌]MFC & C - 대용량 파일 빨리 읽기 대용량의 파일 순식간에 읽기1.요약 10M 이상이 되는 파일을 빠르게 읽는 방법을 알아보기로 합니다. 2.본문 v 파일 읽기는 자주 사용하실 것인데.. CFile::Read를 사용하면.. 10MB정도 되는 파일을 읽으면 무진장 오래 걸려서.. 메모리 맵 파일을 이용한 파일 읽기 방법을 올려 들립니다.. 많은 예제가 나온것으로 알지만.. 혹시... 도 몰라서.. BOOL OpenFiles(LPCSTR lpszPathName) { DWORD dwFileSize; HANDLE hFile, hFileMap; LPVOID lpvFile; hFile = ::CreateFile(lpszPathName, GENERIC_READ , 0, NULL OPEN_EXISTING, FILE_ATTRIBUTTE_NORMAL, NU.. 더보기
[펌]C/C++ Secure Function 에 대해서 Visual Studio 2005 Secure Function 에 좀더 쓰겠습니다. 사실 strcpy 류의 함수를 _s 의 postfix를 붙여주는 것만으로는 충분하지 않습니다. char szBuf[10]; strcpy(szBuf, “test”) 와 같은 코드를 그냥 컴파일 하면 분명히 deprecated warning이 나옵니다. 그리고 _CRT_SECURE_NO_DEPRECATE 를 정의하거나, #pragma warning 을 이용해서 warning control을 할 수 있습니다. 이 방법은 예전의 방법입니다. Secure check를 전혀 하지 않는 방법이지요. 그런데 C++의 특성상 string manipulation 과정에서 buffer overrun이나 stack을 깨먹는 경우가 허다해서 _.. 더보기
다중 스레드 동기화 (2) 커널 모드 유저 모드에서 커널 오브젝트에 접근을 할 때 시스템은 커널 모드로 변환을 합니다.커널 오브젝트에는 File, Event, Mutex, Semaphore, Process, Waitable Timer, Job, Thread 가 있습니다. 커널 모드에서 동기화는 커널 오브젝트가 non-Signal인지 Signal 상태인지를 보고 쓰레드를 스케쥴링합니다.커널 오브젝트가 signal상태이면 쓰레드가 돌아갈 준비가 된 상태이고, non-signal 상태이면 쓰레드는 기다림(Wait)상태 입니다. 이벤트(EVENT) 가장 많이 보편화되고 많이 쓰는 다중 쓰레드 동기화 오브젝트가 이벤트가 아닌가 생각이 됩니다.이벤트로 다중 쓰레드 동기화 하는 방법에는 두가지 방법이 있습니다. 개발자가 직접 이벤트를 수동으로.. 더보기