[C++] 비트 단위로 제어하기

비트 필드는 구조체와 흡사하나 구조체는 byte 단위로 멤버를 사용할 수 있지만 비트 필드는 bit 단위로 멤버를 사용할 수 있다. 그래서 많은 상태를 저장하거나 bit별로 제어해야 하는 경우에 비트 필드를 사용한다. 비트 필드의 멤버는 unsigned형(unsigned int형)과 int형의 멤버를 가질 수 있고 비트 필드 변수의 크기는 int형 크기와 같은 4byte(32bit)이다. signed와 unsigned는 char, short, int, long 등의 자료형 앞에 사용되어 부호가 있는 정수와 부호가 없는 정수를 나타내는 자료형으로 사용되며 signed는 보통 생략하여 사용한다. 비트 필드처럼 unsigned가 단독으로 사용되면 unsigned int형을 간략하게 표현한 형태이다. 다음은 비트 필드를 사용하여 1bit씩 제어하는 예제이다. #include <stdio.h> #include <string.h> struct _bitfield { unsigned b0:1; unsigned b1:1; unsigned b2:1; unsigned b3:1; unsigned b4:1; unsigned b5:1; unsigned b6:1; unsigned b7:1; }; void main() { struct _bitfield bit; memset(&bit, 0, sizeof(struct _bitfield)); bit.b0 = 1; bit.b7 = 1; printf("%d\n", sizeof(struct _bitfield)); printf("%08x %d\n", bit, bit); } memset() 함수를 사용하여 bit 변수 4byte를 0으로 초기화하고 bit.b0와 bit.b7을 1로 만들어 결과는 0x81이 된다. bit 변수는 32bit 중 8bit만을 ...

시간에 요일 표시

날짜 및 시간 조정. "추가 시계" 메뉴 선택. "날짜 및 시간" 시간 창 뜨면 "날짜 및 시간" 탭 선택. "날짜 및 시간 변경" 버튼 클릭. "날짜 및 시간 설정" 창 뜨면 "달력 설정 변경" 클릭. "국가 또는 지역" 창 뜨면 "추가 설정" 버튼 클릭. <- 여기부터 시작해도 됨. "형식 사용자 지정" 창 뜨면 "날짜" 탭 선택. "날짜 형식"의 "간단한 날짜" 아래와 같이 설정 yyyy-MM-dd '('ddd')'

[bat] bat 파일 실행 시 관리자 권한으로 실행하도록 요구하는 샘플 코드

@echo off bcdedit >>nul if %errorlevel% == 1 ( echo ▶ 관리자 권한이 아닙니다. echo ▶ 파일을 우클릭하여 관리자 권한으로 실행하십시오. pause exit ) else ( @echo off :: 관리자 권한으로 실행 되었을 경우 실행 될 코드 여기에 작성. pause exit )

[Git] 자주 발생하는 이슈들

하위 디렉토리에 있는 모든 파일 추가 $ git add -f (폴더 이름)/\* $ git add -f ./\* fatal: You have not concluded your merge (MERGE_HEAD exists). Please, commit your changes before you merge. 메시지가 뜨는 경우 Git Bash에 아래 명령어 입력 $ git merge --abort Remote Branch 이름 변경 Local에 있는 Branch 이름 변경 $ git branch -m old_branch new_branch Remote에 존재하는 old_branch 삭제 $ git push origin :old_branch new_branch 푸시하기 $ git push origin new_branch Push 되돌리기 $ git reset --hard HEAD~n (n은 되돌릴 작업의 갯수 ex) git reset --hard HEAD~2) $ git push origin master (암호 입력 요구함) [Git] file name too long 이슈 $ git config --system core.longpaths true

[C++] COM 연동 샘플 소스

#import "fileName.tlb" no_namespace rename ("GetUserName","GetUserNameA") void Function() { // 프로젝트 폴더의 소스 파일이 있는 폴더 내 'fileName.tlb' 파일 수정 // 해당 'fileName.tlb' 파일에 맞춰서 'INTERFACE', 'COCLASS' 수정 // IDL 파일에서 interface INTERFACE : IDispatch // IDL 파일에서 coclass COCLASS INTERFACE * interface = NULL; if (interface == NULL) { HRESULT hr; hr = ::CoInitialize(NULL); if (SUCCEEDED(hr)) { hr = ::CoCreateInstance(__uuidof(COCLASS), NULL, CLSCTX_LOCAL_SERVER, __uuidof(INTERFACE), (void**)&interface); if (FAILED(hr)) { MessageBoxA(NULL, "COM 객체 생성 실패", "lpCaption", MB_OK); return; } else { interface->FuncCall(); ::CoUninitialize(); } } } return; }

[NSIS] 사설 인증서 등록

# 사용 예 # Call Registering_Certificate_In_Trusted_Root_Certification_Authorities Function Registering_Certificate_In_Trusted_Root_Certification_Authorities # 사설 인증서 등록 (IE, 크롬, 사파리, 오페라) ${AddCertificateToStore} $0 "$VAR_INSTDIR\cert\${CERT_NAME_COMPANY_ROOT_AUTHORITY}" ${If} $0 != success MessageBox MB_OK "certificate import failed: $0" ${EndIf} ${AddCertificateToStore} $0 "$VAR_INSTDIR\cert\${CERT_NAME_DIGICERT_HIGH_ASSURANCE_EV_ROOT_CA}" ${If} $0 != success MessageBox MB_OK "certificate import failed: $0" ${EndIf} ${AddCertificateToStore} $0 "$VAR_INSTDIR\cert\${CERT_NAME_DIGICERT_TRUSTED_ROOT_G4}" ${If} $0 != success MessageBox MB_OK "certificate import failed: $0" ${EndIf} # 사설 인증서 등록 (파이어폭스) System::Call 'shell32::SHGetSpecialFolderPath(i $HWNDPARENT, t .r2, i ${CSIDL_APPDATA}, i0)i.r0' IfFileExists "$2\Mozilla\Firefox\profiles.ini" EXIST_FIREFOX NON_EXIST_FIREFOX EXIST_FIREFOX: ...

[BAT] 문자열 변경

:: 문자열 변경 :: %(변수 이름):(찾을 문자)=(변경할 문자)% :: ex) :: set VarName=abc :: echo %VarName% :: "abc" 출력 :: set VarName=%VarName:a=d% :: echo %VarName% :: "dbc" 출력 :: set VarName=%VarName:b=% :: echo %VarName% :: "dc" 출력

Print Screen 키를 사용하여 화면 캡처 열기

접근성 - 키보드 Print Screen 바로 가기 PrtScn 단추를 사용하여 화면 캡처 열기

[Git] Repository clone

// Git Bash에서 아래 명령어 실행. git clone (URL) (폴더 이름)

[Git] Remote Branch 이름 변경

1. Local에 있는 Branch 이름 변경 git branch -m old_branch new_branch 2. Remote에 존재하는 old_branch 삭제 git push origin :old_branch 3. new_branch 푸시하기 git push origin new_branch

[Git] Push 되돌리기

git reset --hard HEAD~n (n은 되돌릴 작업의 갯수 ex) git reset --hard HEAD~2) git push origin master (암호 입력 요구함)

[Git] file name too long

git config --system core.longpaths true

[NSIS] 인증서 설치

# https://nsis.sourceforge.io/Import_Root_Certificate # 사용 예 # ${AddCertificateToStore} $0 "$VAR_INSTDIR\rootcert.cer" !define CERT_QUERY_OBJECT_FILE 1 !define CERT_QUERY_CONTENT_FLAG_ALL 16382 !define CERT_QUERY_FORMAT_FLAG_ALL 14 !define CERT_STORE_PROV_SYSTEM 10 !define CERT_STORE_OPEN_EXISTING_FLAG 0x4000 !define CERT_SYSTEM_STORE_LOCAL_MACHINE 0x20000 !define CERT_STORE_ADD_ALWAYS 4 !macro _AddCertificateToStore un Function ${un}_AddCertificateToStore Exch $0 Push $1 Push $R0 System::Call "crypt32::CryptQueryObject(i ${CERT_QUERY_OBJECT_FILE}, w r0, \ i ${CERT_QUERY_CONTENT_FLAG_ALL}, i ${CERT_QUERY_FORMAT_FLAG_ALL}, \ i 0, i 0, i 0, i 0, i 0, i 0, *i .r0) i .R0" ${If} $R0 0 System::Call "crypt32::CertOpenStore(i ${CERT_STORE_PROV_SYSTEM}, i 0, i 0, \ i ${CERT_STORE_OPEN_EXISTING_FLAG}|${CERT_SYSTEM_STORE_LOCAL_MACHINE}, \ w 'ROOT') i .r1" ${If} $1 0 System::Call "crypt32::CertAddCe...

[NSIS] 권한 상승

# https://nsis.sourceforge.io/UAC_plug-in !macro _UAC_Elevation un Function ${un}_UAC_Elevation Push $R0 Exch Pop $R0 uac_tryagain: !insertmacro UAC_RunElevated ${Switch} $0 ${Case} 0 ${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done ${IfThen} $3 0 ${|} ${Break} ${|} ;we are admin, let the show go on ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user MessageBox mb_YesNo|mb_IconExclamation|mb_TopMost|mb_SetForeground "This $R0 requires admin privileges, try again" /SD IDNO IDYES uac_tryagain IDNO 0 ${EndIf} ;fall-through and die ${Case} 1223 MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "This $R0 requires admin privileges, aborting!" Quit ${Case} 1062 MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Logon service not running, aborting!" Quit ${Default} MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Unable to...

[NSIS] 특수 경로 얻어오기

# 설치 경로에 '$'가 포함된 특수 경로이면 해당 경로를 찾아서 SetOutPath 설정, '$'가 포함되어 있지 않으면 들어온 경로 그대로 설정. # 호출 예 # ${GetSpecialPathReplaced} '반환' '특수 경로가 포함된 경로' # ${GetSpecialPathReplaced} $0 "$DESKTOP\test" # $0 == '$DESKTOP 부분이 로컬 PC의 환경에 맞춰 경로를 얻어오고 나머지 뒷 부분은 그대로.' !define CSIDL_DESKTOP '0x0' # Desktop path ($DESKTOP) !define CSIDL_PROGRAMS '0x2' # Programs path !define CSIDL_PERSONAL '0x5' # My document path !define CSIDL_FAVORITES '0x6' # Favorites path ($FAVORITES) !define CSIDL_STARTUP '0x7' # Startup path !define CSIDL_RECENT '0x8' # Recent documents path ($RECENT) !define CSIDL_SENDTO '0x9' # Sendto documents path ($SENDTO) !define CSIDL_STARTMENU '0xB' # StartMenu path !define CSIDL_MUSIC '0xD' # My Music path ($MUSIC) !define CSIDL_DESKTOPDIR '0x10' # Desktop Directory path !define CSIDL_COMPUTER '0x11' # My Compute...