전체 글

C++ TIPS

'빌드 후 이벤트'로 헤더파일을 복사할 때 읽기 전용으로 복사하기.

라이브러리 프로젝트의 경우 빌드 후 이벤트에 batch 파일을 등록해서 참조용 헤더 파일을 복사하도록 설정하는 경우가 많다. 그런데 문제는, 해당 라이브러리를 쓰도록 설정한 프로젝트에서 값을 변경하다 보면, 실수로 ‘복사된 헤더파일’의 코드를 변경해서 변경사항이 적용되지 않는 불상사가 종종 발생한다. 이 문제를 방지하기 위해서 파일들을 읽기 전용으로 복사하는 편이 좋다. 참고용 코드 :: *.h, 파일 복사(라이브러리 참조용) xcopy /d /s /y /i /r ".\Project\DirectXTex\DirectXTex.h" ".\External\Include\DirectXTex\" ::헤더 파일 읽기 전용으로 변경 attrib +r ".\External\Include\DirectXTex\*.h" xc..

ETC

씽크패드 트랙포인트 키보드 드라이버 설치후 캡스락 표시 제거

캡스락 누를때마다 위 아이콘이 자꾸 떠서 짜증났었는데 C:\Program Files (x86)\Lenovo\External TrackPoint Keyboard driver\res\ 위 폴더에서 표시하고 싶지 않은 이미지 파일을 지워주면 된다.

ETC

5. 작업 스케줄러를 통해 윈도우 시작시마다 '관리자 권한'으로 실행되도록 해주기

관리자 권한으로 실행하는 이유? 관리자 권한으로 실행하지 않으면 관리자 권한으로 실행되는 프로그램에서는 오토핫키 기능이 작동하지 않거나 이상하게 작동한다. 시작 프로그램으로는 관리자 권한으로 실행되도록 설정할 수가 없지만, '작업 스케줄러' 라는 기능을 활용하여 윈도우 시작시마다 관리자 권한으로 오토핫키 스크립트가 실행되도록 할 수 있다. 빅스비 루틴이나 애플의 단축어 자동화 기능과 비슷한 기능을 활용하는 것임. 1. 작업 스케줄러 열기 윈도우 + R 키로 실행창을 연 뒤 taskschd.msc 입력 후 실행 2. 작업 만들기를 눌러 새 작업 만들기 3. 일반 탭 : 이름, 설명 설정 + 관리자 권한으로 실행되도록 설정 나중에도 알아볼수 있도록 이름과 설명을 입맛대로 설정해 주고 '가장 높은 수준의 권한..

ETC

4. 오토핫키를 이용해 키조합 설정해주기

※ 오토핫키에 대해 깊이 알고있는 것이 아니라 단순 키변경 정도만 아는 수준입니다. 더 좋은 방법이 있을 수 있습니다. 1. 오토핫키 2.0 설치 https://www.autohotkey.com/ 2. 프로그램을 실행한 뒤 'new script' 로 새 스크립트 파일 생성 3. 생성된 스크립트 파일을 메모장 등으로 열어주기 4. 다음의 코드를 추가한 후 저장. SetCapsLockState("AlwaysOff") PgUp::Return PgDn::Return RShift & u::{ if(GetKeyState("LShift")) SendInput("^+{Up}") else SendInput("{Up}") Return } RShift & j::{ if(GetKeyState("LShift")) SendInp..

ETC

3. 레지스트리를 통해 키 변경하기

1. Windows+R 키조합에서 regedit 입력 후 확인. 레지스트리 편집기 창이 열린다. 2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout 해당 경로로 이동. Keyboard Layouts가 아니라 Keyboard Layout 이다. 주의할 것 3. 우측 창 우클릭 → 새로 만들기 → 이진값 → 이름을 'Scancode Map'으로 변경 4. 생성한 레지스트리를 더블클릭. 값 수정 창이 나오는데 어려워할것 없다. 한 줄당 숫자 한 쌍이 8자리가 있다고 생각하자. 각각 1번째 자리 ~ 8번째 자리 라고 생각해준다. 일단 첫번째 줄은 무조건 모두 0이다. '00'을 8번 쳐주면 된다. 5. 두번쨰 줄의 첫 1번째 자리에는 '..

ETC

레지스트리 + 오토핫키로 키보드 키 커스텀 + 자동화

며칠 전부터 캡스락 키가 사용량에 비해 너무 입지가 좋다는 생각이 들어서 옮기기로 마음먹었다. 강남 노른자땅에서 농사짓는 느낌? 그 과정에서 생긴 문제점들과 설정 방법을 나중에 컴퓨터를 바꿔도 쓸 수 있도록 기록을 남겨놓으려고 한다. 1. 바꾸게 된 이유 + 최종 설정 처음에는 단순히 캡스락 버튼과 컨트롤 버튼을 스왑하는 선에서 그치려고 했었지만, 내 기준으로는 컨트롤 버튼을 누르려고 손목이 꺾이는 빈도보다 오른손이 방향키나 백스페이스를 누르기 위해 손목이 꺾이는 빈도가 훨씬 많다고 생각되어 최종적으로는 좀 다른 방법으로 설정하게 되었다. 최종적으로는... 컨트롤 버튼은 그대로 사용 레지스트리를 통해 캡스락 버튼을 누르면 RSHIFT 버튼이 눌리도록 설정 오토핫키를 통해 아래의 키 조합 및 기능을 설정 ..

자습

실험실) ||(OR 연산자)의 결합 방향과 특징

|| 연산자(OR)의 특징은 논리검사 대상 중 하나라도 true가 반환될 경우 true를 반환한다. 그리고 || 연산자의 결합 방향은 →(오른쪽) 방향이다. 그렇다면 아마 C++에서는 최적화를 위해서 왼쪽 파트의 논리 검사에서 true가 반환된다면 오른쪽 파트는 검사를 스킵하지 않을까? 라는 의문이 들었다. 바로 실험해보자 #include #include int main() { std::vector vecIntPtr; vecIntPtr[0] = 1; return 0; } 우선 위의 코드를 실행 시키면 vecIntPtr에는 원소가 하나도 추가되지 않았으므로 0번 인덱스를 강제로 참조하게 되면 아래와 같은 에러가 발생한다. 또한 std::vector의 empty() 함수는 생성한 벡터 컨테이너가 비어있을 경..

자습

실험실)typeid(T).name() vs typeid(T).hash_code()

name()이 걱정되는 점 : T에서 타입명을 추론하고 이를 문자열로 변환하는 과정이 오래걸릴 거 같음 hash_code()가 걱정되는 점: T를 해쉬코드로 변경하는 알고리즘이 복잡할 것 같음 #include #include #include "Timer.h" int main() { CTimer Timer; float T = 0.f; Timer.StartTimer(); for (int a = 0; a < 100000; ++a) { std::string mystr = typeid(int).name(); mystr = typeid(float).name(); mystr = typeid(CTimer).name(); mystr = typeid(char).name(); mystr = typeid(DWORD).name..

C++ TIPS

Dynamic Link Library 직접 만들고 링크해보기

이글에선 초보도 일단 해볼수 있도록 간단한 사용 방법만 설명. 원리는 구글링하면 설명 잘해주는글 수두룩하므로 그걸 볼것. —이론— 정적 링크 라이브러리는 컴파일 시 코드가 연결된 프로그램에 합쳐진다. 소스코드 + (라이브러리 헤더 파일) + lib → exe 동적 링크 라이브러리는 컴파일 시 연결된 프로그램에 합쳐지지 않는다.→ dll과 연결된 함수 주소만 프로그램에 합쳐놓고, 자세한 내용은 dll에서 참조해서 사용하는 방식 쉽게 생각해서 주소록만 등록시켜놓고 사용하는 방식이라고 보면 될것 같다. 소스코드 + (라이브러리 헤더 파일) + lib → exe + dll —실전— 1. 라이브러리용 프로젝트 만들기 1. 빈 프로젝트 하나 생성 2. 이렇게 헤더와 소스파일을 각각 하나씩 만들어준다. 3. 동적 링..

C++ TIPS

Static Link Library 직접 만들고 링크해보기

이글에선 초보도 일단 해볼수 있도록 간단한 사용 방법만 설명. 원리는 구글링하면 설명 잘해주는글 수두룩하므로 그걸 볼것. —이론— 정적 링크 라이브러리는 컴파일 시 코드가 연결된 프로그램에 합쳐진다. 소스코드 + (라이브러리 헤더 파일) + lib → exe 동적 링크 라이브러리는 컴파일 시 연결된 프로그램에 합쳐지지 않는다.→ dll과 연결된 함수 주소만 프로그램에 합쳐놓고, 자세한 내용은 dll에서 참조해서 사용하는 방식 쉽게 생각해서 주소록만 등록시켜놓고 사용하는 방식이라고 보면 될것 같다. 소스코드 + (라이브러리 헤더 파일) + lib → exe + dll —실전— 1. 라이브러리용 프로젝트 만들기 1. 빈 프로젝트 하나 생성 2. 이렇게 헤더와 소스파일을 각각 하나씩 만들어준다. 3. 헤더 파..

DX2D StarCraft 모작

스타크래프트 구버전 리소스(스프라이트) 추출하기

스타크래프트 게임 모작 등으로 스프라이트 데이터를 추출하고자 하는 분들을 위해 작성합니다. 1. 준비물스타크래프트 게임 내부의 다음 3개 파일리마스터는 추출이 불가능하므로 구버전 설치 또는 립버전에서 뽑아오면 된다. Total Commander 프로그램 설치https://www.ghisler.com/ Total Commander mpq 플러그인 다운로드https://totalcmd.net/plugring/mpq.html PyMS 다운로드https://github.com/poiuyqwert/PyMS#installation 2. Total Commander로 mpq파일 압축 풀기Total Commander를 설치했으면 다운받은 mpq 플러그인(wcx_mpq) 파일의 압축을 풀어준다. mpq.wcx 파일과 L..

C++ TIPS

Visual Studio 컴파일 속도 올리기

우리는 이를 여러 개의 헤더 파일과 cpp 파일로 분리하여 클래스 형태로 쪼개서 프로그래밍한다. 순차적 프로그래밍으로 main.cpp에 모든 코드를 떄려박는 것은 가독성이나, 코드 유지보수 면에서 매우 비효율적이기 때문이다. 하지만 이런 식으로 프로그래밍을 할 경우 컴파일 때 문제가 생긴다. 순차적 프로그래밍에서는 이것저것 확인할 필요 없이 코드 순서대로 컴파일을 해나가면 되지만, 객체 지향 프로그래밍에서는 한 클래스에서 이것저것 참조하는 데이터가 생기므로 여기저기 왔다갔다 하면서 컴파일해야 하기 때문이다. 사람의 가독성은 올라갔지만 컴파일 시의 가독성은 떨어졌다고 볼 수 있겠다. 당연히 이건 프로그램이 빌드되는 걸 지루하게 기다리는 나에게만 해당되는 내용이 아니었다. 많은 개발자들이 컴파일 속도를 올리..

hyrule
C++ 프로그래밍 공부