목록
-
인라인 함수Programming Language/C++ 2017. 8. 8. 22:19
(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다) 인라인 함수는 속도 감량에 매우 큰 도움이 됩니다. 인라인 함수는 보통 함수를 호출할 경우 눈에 보이는 것처럼 그 함수에 가서 코드를 실행하는 것이 아니라 해당 코드에서 바로 함수 내부의 코드를 실행시키기 때문에 매개변수를 복사하거나, 다음 코드로 가게 하는 흐름을 생략해 주기 때문이죠. 그럼 "모든 함수를 인라인 함수로 선언해 주면 되겠다." 라는 생각이 분명히 들게 됩니다. 하지만 그럴 수는 없습니다. 프로그래머가 인라인 함수를 선언했다고 해도 그 함수가 인라인 함수가 되느냐 안 되느냐는 컴파일러가 결정하기 때문이죠. 인라인 함수가 안 되는 경우는 다음과 같습니다 1. 재귀함수 2. 다른 코드에서 함수의 주소를 가져와서 호..
-
[Win32 API] 윈도우 모니터 중간으로 위치 이동하기Programming Language/C++ 2017. 8. 8. 22:15
(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다) 폼 위치는 WNDCLASS 구조체나, CreateWindow 파라미터로 지정할 수 없기 때문에 WM_CREATE 메시지지로, SetWindowPos 또는 MoveWindow API로 변경합니다. 보통 폼 위치만 바꾸는 기능은 MoveWindow이기 때문에 SetWindowPos 보다는 MoveWindow를 많이 사용합니다. BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint); hWnd - 크기를 변경할 윈도우의 핸들 X - left Y - top nWidth - right nHeight - bottom bRepaint - 1 또는 0(..
-
[Win32 API] 다이얼로그 아이콘 변경Programming Language/C++ 2017. 8. 8. 22:12
(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다) CreateWindow API를 사용해서 폼을 생성하는 경우 WNDCLASS 구조체의 icon 멤버에 LoadIcon API를 사용하여 아이콘을 변경해 주면 되지만 다이얼로그는 조금 다릅니다. HICON 변수에 LoadImage API로 아이콘 이미지를 넣고, WM_INITDIALOG 메시지가 호출될 시 SendMessage API로 WM_SETICON 메시지를 호출시켜야 합니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include "resource.h" #include HICON hIcon; BOOL ..
-
OS X에서 pyenv / virtualenv / virtualenvwrapper 설치 및 사용하기Programming Language/Python 2017. 8. 5. 21:21
homebrew가 설치된 환경에서 포스팅합니다. pyenv: 다양한 파이썬 버전을 설치할 수 있는 독립적인 환경을 제공합니다.virtualenv: 패키지를 독립적인 환경에서 각각 설치할 수 있도록 합니다.virtualenvwrapper: 가상환경이 설치된 경로를 기억해야 한다는 virtualenv의 단점을 보완 1. 먼저 pip를 설치합니다. 1sudo easy_install pipcs 2. brew로 pyenv를 설치하고, pip로 virtualenv, virtualenvwrapper를 설치합니다. 1234567891011# pyenv 설치brew updatebrew install pyenv # virtualenv 설치pip install virtualenv # virtualenvwrapper 설치pi..
-
LRESULT / CALLBACK / WPARAM / LPARAMProgramming Language/C++ 2017. 7. 9. 04:09
(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다) Win32 API 경험자라면 LRESULT CALLBACK Func(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 형태의 콜백 함수를 많이 보셨을 겁니다. 의미를 알기 쉬웠던 HWND(핸들), UINT(unsigned int)를 제외한 키워드들이 어떤 의미를 함축하고 있는지 알아보겠습니다. 1. LRESULT LRESULT은 이렇게 선언돼 있습니다. 1 2 #typedef long LONG_PTR #typedef LONG_PTR LRESULT cs long 과 같습니다. 왜 typedef로 재정의가 되었냐면 개발 시 리턴값임을 명시해 주기 위해서입니다. 2. CALLBACK..
-
EATEtc 2017. 7. 3. 02:39
(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다) EAT(Export Address Table)는 라이브러리에서 함수 시작 주소를 구할 때 사용됩니다. 라이브러리 외 PE 파일은 Export 할 함수가 없으니 EAT를 가리키는 주소가 NULL로 셋팅되어 있습니다. EAT 정보는 IMAGE_EXPORT_DIRECTORY 라는 구조체에서 확인할 수 있습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; DWORD MajorVersion; DWORD MinorVersion; DWORD Name; DWORD Base; ..
-
IATEtc 2017. 6. 13. 02:09
(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다) IAT는 Import Address Table의 약자로 프로그램에서 import한 라이브러리에서 사용하는 함수명, 함수 시작 주소가 저장된 테이블입니다. IAT는 IMAGE_IMPORT_DESCRIPTOR 구조체에서 RVA 형태로 명시되고 있는데요. 이 구조체는 그 외에도 INT, import한 라이브러리의 이름 등의 값을 저장합니다. 여기서 INT란 Import Name Table의 약자로, import 한 라이브러리의 함수 이름들이 배열 형태로 저장되어 있습니다. 그럼 이제 IMAGE_IMPORT_DESCRIPTOR 구조체에서 필요한 부분만 살펴보도록 하겠습니다. 1 2 3 4 5 6 7 8 9 10 typedef stru..
-
__cdecl, __stdcall 차이점Programming Language/C++ 2017. 1. 2. 00:06
(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다) 1. __cdecl 함수 호출용으로 스택에 쌓은 파라미터를 호출한 함수에서 제거해 주는 Convention이다. 알기 쉽게 간단한 예시를 보자. Colored By Color Scripter™ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include int __cdecl cdeclFunction(int a, int b) { return a + b; } int main() { int varA = 1, varB = 2; cdeclFunction(1, 2); return 0; } 위 C 코드를 Assembly로 짜보았다. (어셈블리 프로그래밍이 익숙하지 않아서 문법에 맞지 않는 부분이 있을 수 있는데 중요하지 않으..