본문 바로가기

Programming/Windows Visual C++

C언어의 메모리 구조(Data, Heap, Stack) 프로그램이 OS에 의해 실행되어 프로세스가 되면 이 프로세스는 메모리 공간을 할당받는다. 프로세스에 할당되는 메모리 공간은 Data, Heap, Stack영역으로 나뉜다. Data 영역: 전역변수와 static변수가 할당되는 영역. 전역변수와 static변수는 프로그램이 시작되면 할당되고 종료되면 메모리에서 소멸된다. Heap 영역: 메모리 공간을 동적할당할 때 할당되는 영역. 프로그램 시작시에 정해진 stack영역과는 달리 프로그램 실행 도중(런타임시)에 할당되는 영역이다. Stack 영역: 함수 내의 지역변수와 매개변수가 저장되는 영역. 함수가 호출될 시 생성되고 호출이 완료되면 사라진다. 이 stack영역에 얼만큼의 메모리 공간이 할당될지는 컴파일 시에 결정된다. 함수가 여러번 재귀로 호출되면 이 .. 더보기
/MT /MD 옵션의 차이 /MT와 /MD의 차이 /MTd는 /MT의 디버그버전. 마찬가지로 /MDd는 /MD의 디버그 버전. /MT: 내가 만드는 응용 프로그램이 C런타임 라이브러리의 기능을 사용할 때 static link version인 LIBCMT.lib를 사용하여 프로그램이 빌드된다는 뜻. /MD: 내가 만드는 응용 프로그램이 C런타임 라이브러리의 기능을 사용할 때 dynamic link version인 MSVCRT.lib를 사용하여 프로그램이 빌드된다는 뜻. 즉 내가 dll을 만들든 .lib를 만들든 그냥 .exe를 만들든 이 옵션은 아무거나 골라도 상관이 없음. 문제는 .lib를 가져다가 쓰는 경우 이 /MT /MD옵션이 맞지 않으면 'XXX is already defined in YYY’같은 에러가 뜨면서 컴파.. 더보기
.lib와 .dll의 차이 동적 라이브러리(.dll) 프로그램 실행 시 필요시만 DLL 파일에서 함수를 참조 프로그램 실행 시 DLL을 모두 로드하지 않기 때문에 프로그램 로딩 시간이 단축 함수 업그레이드 시 해당 DLL만 수정 배포하면 되기때문에 용이 소스 외부 유출 방지 효과 .exe 파일 만들때 필요한 파일: .h,.lib (*.dll 참조 용). dll자체는 필요 없다. .exe 파일 실행할 할 때 필요한 파일: *.dll (배포할 때 *.dll 필요) dll 제작 시 lib도 같이 생성됨(dll 참조용) 정적 라이브러리(.lib) 필요한 함수를 프로그램 코드에 붙여 컴파일 시 프로그램 자체에서 참조 프로그램 실행 후 빠른 처리시간 컴파일 시 .lib는 .exe내부에 모두 녹아 들어가므로 프로그램 .exe파일만 있으면 .l.. 더보기
윈도우 서비란 무엇인가? 서비스 만들기 서비스란 무엇인가? 윈도우 기동 과정: 부팅 > 드라이버 로딩 > 서비스 로딩 > 로그온 > 응용 프로그램 로딩 위에서 보듯 사용자 로그온 전에 서비스가 먼저 로딩된다. 서비스는 일반적으로 Local System Account로 구동되기 때문에 시스템을 제어하는데 강력한 권한을 가진다. 일반 사용자 계정으로 구동도 가능한데 service.msc에 들어가 서비스 속성의 Log On탭에서 바꿔줄 수 있다.(혹은 .exe프로그램 코딩할 때 WINAPI CreateService() 함수의 인자를 이용해서 바꿔줄 수 있다.) 서비스는 시스템 경로에 파일 읽기/쓰기, 로컬 시스템 레지스트리 엑세스와 같은 모든 작업을 할 수 있는 권한이 있고 UAC에 영향을 받지 않고 돌아가는 장점을 가진다. 서비스 또한 근본적으로.. 더보기
함수에서 문자열을 리턴하는 올바른 방법 문제는 아래와 같은 함수는 return 시 지역변수의 메모리가 날아가버리기 때문에 리턴한걸 받아다가 쓰려고 해도 문제가 생기거나 나중에 문제가 생긴다는 것이다. 가끔 myHomeDir이 찍히기도 하지만 대부분 잘 안찍히거나 나중에 잘 안찍힌다.char* GetHomeDir() { char szHomeDir[1024] = "C:\Temp\Myhome"; return szHomeDir; } void main() { char* myHomeDir = GetHomeDir(); printf("MyHomeDir: %s\n", myHomeDir); } - 가장 올바른 C 방법은 char* 리턴형을 사용하지 않고 변수에 메모리를 할당 한 다음 함수 파라미터로 입력받을 값의 포인터와 사이즈를 넣어주는 것이다. ```C v.. 더보기
.h파일 include하는 올바른 방법 서로 클래스가 물고 물리는 경우 어떻게 include를 해야 syntax에러가 안나올 수 있을까? stdafx.h에 모든 header file을 include한다고 했을 때, 윗쪽에 선언된 클래스는 아랫쪽에 선언된 클래스를 알지 못한다. 그래서 일단 #include하는 순서가 중요하다. 하지만 클래스가 서로를 물고 물리는 recursive형태를 가지게 되면 #include가 중복으로 되든지 아니면 #pragma once에 의해 #include를 해도 어느쪽에서는 무시되어 여전히 서로를 알아보지 못한다. 유일한 방법은 class a;를 header파일 윗쪽에 써주는 것이다. 구체적으로 class A, B, C가 있다고 생각해보자. A는 B* b, C* c 를 멤버변수로 갖는다. B는 A* a를 멤버변수로 .. 더보기
Rabbitmq-c 와 CURL 라이브러리 사용법 Rabbitmq-c와 Curl 모두 SSL(TLS)연결 시 openssl라이브러리를 사용하는데 서로 다른 버전의 라이브러리를 사용하도록 .lib를 빌드하면 amqp socket만들 때 에러가 발생한다. 꼭 두개의 버전을 맞춰야 함에 유의하자. OpenSSL라이브러리 설치 라이브러리 다운로드: Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 라이브러리는 Win32 OpenSSL v1.1.1d를 설치하자. .exe파일을 다운받아 실행하면 설치파일이 실행된다. 설치파일 실행 도중 OpenSSL DLL을 어디에 위치시킬지 경로를 물어보는데 이 경로에 'libcrypto-1_1.dll', 'libssl-1_1.dll.. 더보기