시작은 미미하나 끝은 쥬쥬하리라.

Windows 6

[Window OS] 낡은 창 핸들(Stale Window Handle)과 초기화 경로에만 있던 설정

목차증상원인해결기술 배경요약1. 증상주소를 넣는 입력칸 옆에는 최근에 쓴 주소 목록을 펼치는 버튼이 있음. 목록에서 하나 고르면 입력칸에 그 주소가 들어가야 함. 그런데 목록에서 주소를 골라도 아무 일도 일어나지 않음.- 목록은 정상적으로 펼쳐짐. 항목도 제대로 들어 있음.- 고르면 목록이 닫히기는 함. 그런데 입력칸은 그대로임.- 오류 창도, 로그도 없음. 그리고 항상 나는 것이 아니었음.-> 오브젝트 속성의 기본 탭에서 열면 정상 동작함.-> 기본 탭을 먼저 쓰고 나서 효과·동작 탭으로 넘어가 열면 그때부터 안 됨.=> "탭을 옮기면 안 된다"가 유일한 단서였음.2. 원인최근 주소 목록은 고른 결과를 창 메시지로 되돌려주는 구조였음.-> 목록이 직접 입력칸을 고치지 않음. "이 주소가 선택됐다"는 메..

[Window OS] 다중 모니터 가상 좌표계와 팝업 기준 모니터 고르기

목차증상원인해결기술 배경요약1. 증상HMI 편집 도구에는 주소를 입력할 때 뜨는 숫자 키패드 창이 있음. 여러 화면에서 공용으로 씀. 듀얼 모니터로 쓰는 경우에 어색한 동작이 있었음.- 편집 도구 본체는 1번 모니터에, 작업 중인 대화상자는 2번 모니터에 띄워둠.- 그 대화상자에서 키패드를 부르면 키패드가 1번 모니터 한가운데 뜸.-> 보고 있던 화면에서 키패드가 사라진 것처럼 보임. 다른 모니터를 찾아봐야 함. 버그라기보다 기준점이 잘못 잡힌 경우임. 기존 코드는 언제나 본체 창의 중앙에 띄우고 있었음.2. 원인띄우는 위치를 정하는 함수가 하나뿐이었고, 그 함수는 본체 창의 중앙을 계산했음. // 기존 : 무조건 본체 창 기준void CenterOnMainWindow(Form* pForm);void N..

[Window OS] 비트수 불일치(Bitness Mismatch)와 중개 프로세스로 우회할 때의 비용

목차상황왜 32비트에서 64비트 DLL 을 부를 수 없는가중개 프로세스와 IPC 선택지왜 공유 메모리가 빠른가그런데 왜 100배 느렸는가결론과 판단 기준요약1. 상황HMI 편집 도구는 오래된 32비트 응용프로그램임. 함께 배포되는 기능 DLL 들도 전부 32비트로 빌드됨. 그런데 같은 DLL 들이 다른 제품군(런타임·뷰어)을 위해 이미 64비트로 마이그레이션이 끝난 상태였음.-> 같은 기능의 DLL 이 32비트 한 벌, 64비트 한 벌. 두 벌이 됨.-> 고치면 두 곳을 고쳐야 하고, 빌드도 두 번, 테스트도 두 번임. 그래서 한 벌로 합치고 싶었음. 편집 도구가 64비트 DLL 을 그대로 쓰면 끝나는 이야기였음. 그런데 안 됨. 여기서부터가 이 글의 내용임.2. 왜 32비트에서 64비트 DLL 을 부를..

[Window OS] 드롭다운 너비 조정(CB_SETDROPPEDWIDTH)과 글자 수로 픽셀을 재는 문제

목차증상원인해결기술 배경요약1. 증상HMI 편집기의 속성 창에는 번역 문자열을 묶어둔 언어 그룹을 고르는 콤보박스가 있음. 그룹 이름이 콤보박스 너비보다 길면 드롭다운을 펼쳐도 이름이 잘려서 보임.-> 앞부분이 같고 뒷부분만 다른 그룹이 여러 개일 때 무엇을 고르는지 알 수 없음. 콤보박스 자체를 넓히는 것은 답이 아님. 속성 창의 폭은 고정이고 다른 항목들과 정렬되어 있음. 요구는 명확했음. 닫혀 있을 때의 너비는 그대로 두고, 펼친 목록만 내용에 맞게 넓히는 것.2. 원인드롭다운 목록의 너비를 맞춰주는 공용 함수가 이미 있었고, 다른 화면 열몇 곳에서 쓰이고 있었음.-> 이 콤보박스에서만 그 함수를 부르지 않았음. 목록을 채우는 곳에 호출이 빠져 있었던 것. 그런데 그 공용 함수를 열어보니 문제가 하..

[Window OS] 수식어 키 판정(Modifier Matching)과 단축키 핸들러 가로채기

목차증상원인해결기술 배경요약1. 증상HMI 편집기의 화면 편집 캔버스에는 선택한 오브젝트를 좌우로 돌리는 단축키가 있음. 사양은 Shift + Ctrl + , 와 Shift + Ctrl + . 임. 그런데 Shift + , 만 눌러도 오브젝트가 돌아감.-> 수식어 하나를 빼고 눌러도 동작함. 사양보다 넓게 먹힘. 게다가 오브젝트를 우클릭했을 때 뜨는 메뉴에는 단축키가 Ctrl + , 로 적혀 있었음.-> 표기는 Ctrl + , / 실제 동작은 Shift + , / 사양은 Shift + Ctrl + , . 셋이 전부 달랐음. 주 편집 화면과 부속 편집 창 양쪽에서 똑같이 재현됨. 특정 오브젝트에만 나는 것도 아니었음.2. 원인두 가지가 겹쳐 있었음. (1) 수식어 판정을 부분집합 비교로 했음키 입력 처리는..

[운영체제] 크리티컬 섹션(CRITICAL_SECTION)과 커널 오브젝트, 성능과 안전망의 교환

목차크리티컬 섹션과 커널 오브젝트성능의 대가 — 소유자 사망요약1. 크리티컬 섹션과 커널 오브젝트Windows 에는 "한 번에 한 스레드만"을 보장하는 도구가 두 부류 있음. 목적이 겹쳐 보이지만 쓰임이 갈림.CRITICAL_SECTION : 유저 모드 상호배제 객체. 커널 오브젝트(Mutex / Semaphore / Event) : 커널이 관리하는 상호배제 객체. 용어 주의 : "임계 영역(critical section)"은 보호해야 할 코드 구간을 뜻하는 개념. CRITICAL_SECTION 은 그 구간을 지키는 Windows API 객체. 이 글은 후자를 말함. 기준 1 — 프로세스 경계 커널 오브젝트는 커널이 실물을 소유하고, 프로세스는 핸들(번호표)로 접근함. -> 핸들 값은 프로세스마다 다..

반응형