본문 바로가기

Programming/Win32&MFC&COM

SDI Document/View 구조 제거하기 MFC의 SDI(Single Document Interface)는 기본적으로 Document/View 구조를 지원합니다.프로젝트를 생성할 때 몇 번의 클릭으로 간단하게 Document/View 기반으로 생성할 수 있습니다.자동으로 생성되는 Doc/View 구조가 필요하지 않을 경우도 발생합니다.SDI에서 Doc/View 구조를 제거하는 방법입니다.먼저 프로젝트를 생성합니다.일단 Document/View architecture support는 그대로 둡니다. Doc/View가 설정된 프로젝트에서 구조를 제거하기 위해서 입니다.Compound Document Support, Document Template Properties는 기본 설정을 사용합니다.그리고 Database Support도 기본 설정으로 둡니.. 더보기
CString 토큰(Token)으로 분리시키기(AfxExtractSubString) C/C++에는 기본적으로 C의 strtok을 통해서 토큰으로 문자열 분리가 가능합니다.토큰(Token)이라는 지정된 문자를 기준으로 문자열을 쪼개면서 추출이 가능합니다.만약 문자열이 "Hello#World"이고 토큰이 '#'이면 다음과 같이 결과를 얻을 수 있습니다.HelloWorldMFC에서도 동일한 기능의 함수가 제공됩니다.AfxExtractSubString() 함수를 통해서 동일한 기능을 제공합니다.먼저 strtok()은 몇 가지 문제점을 가지고 있습니다.원본이 훼손되며 thread-safe하지 않다는 점입니다.strtok()은 두 번째 호출부터는 NULL을 전달합니다.토큰의 위치를 식별하기 위해서 별도의 static 변수를 관리하고 있기 때문입니다.이 변수로 인해서 strtok()을 동시에 쓰면 .. 더보기
BOM(Byte Order Mark)에 따른 파일 처리 Byte Order Mark(BOM)은 바이트 순서 표식이라고 합니다.유니코드 형식(엔디안, 인코딩 방식 등)을 지정하는 일종의 헤더입니다.일반적으로 유니코드가 아닌 경우 BOM이 필요하지 않습니다.하지만 유니코드의 경우는 BOM이 필요할 수 있습니다.Windows가 사용하는 UTF-16 방식의 경우 U+FEFF를 BOM으로 사용합니다.인텔 등이 사용하는 일반 PC의 x86 환경에서는 리틀 엔디안을 따르기 때문에 FF FE로 기록이 됩니다.MFC 등에서 유니코드로 파일을 기록할 때는 먼저 0xFEFF를 바이너리 형태로 입력해야 합니다.이렇게 작성된 파일은 나중에 다시 읽을 때 BOM을 통해서 어떻게 읽는지 알 수 있습니다.UTF-16 외에 각 유니코드 인코딩 방식에 따른 BOM은 다음과 같습니다.Enco.. 더보기
DLL 파일만 있을 때, lib 파일 생성하기 프로젝트가 커지면 DLL을 자주 사용하게 됩니다.DLL을 MFC나 Win32 프로젝트에서 사용하는 방법은 크게 두 가지입니다.첫 번째 방법은 DLL의 함수를 export하는 lib와 h(헤더)파일을 사용하는 방법입니다.두 번째 방법은 LoadLibrary를 통해서 동적으로 DLL을 불러오고 해당 함수의 포인터를 얻는 방법입니다.DLL 내부에서 외부에 노출시키는 함수 목록을 보기 위해서 dumpbin 명령어를 사용할 수 있습니다.Visual Studio를 켜고 TOOLS 메뉴의 Visual Studio Command Prompt를 실행합니다. dumpbin /exports a.dll 이렇게 실행하면 a.dll 내부의 함수 목록을 확인할 수 있습니다.여기서 얻은 정보를 통해서 lib 파일을 생성할 수 있습니.. 더보기
Vista 이후 OS에서 Mic, Speaker 볼륨 셋팅 Windows XP까지 사용하던 볼륨 조절 방법은 CMixer를 사용하는 방법입니다.CMixer를 통해서 볼륨 조절이 가능했습니다.Windows Vista와 Windows 7 이후는 CMixer로 볼륨 조절이 되지 않습니다.Vista부터 Endpoint Volume Controls라는 것이 추가되었습니다.MSDN의 예제를 통해서 볼륨을 조절하는 방법에 대해서 알아봤습니다. Visual Studio 2013을 열고 Win32 Project를 생성합니다.프로젝트 이름은 VolumeControl로 생성했습니다.Empty project 옵션에 체크하고 프로젝트를 생성합니다.먼저 관련된 모든 소스 파일은 아래 링크를 클릭하면 다운로드 받을 수 있습니다.Epvolume.h 파일을 하나 추가해주시고 다음과 같은 코드.. 더보기
파일명 변경하는 API 함수 목록 콘솔창을 연 상태에서 다음 명령어를 실행하면 다음과 같은 결과를 볼 수 있습니다. ren /? 간단하게 파일 이름을 변경할 수 있는 방법을 제공합니다.다음은 코드를 통해서 파일 이름을 변경하는 방법입니다.파일 이름을 변경하는 몇 가지 방법이 존재합니다.1. MFC의 CFile::Rename()을 활용하는 방법이 함수는 두 개의 LPCTSTR 타입의 인자를 전달받습니다.첫 번째는 lpszOldName이고, 두 번째가 lpszNewName입니다.사용법은 이전 파일 파일의 경로, 변경할 파일 경로를 전달하면 됩니다.이 메소드는 static 형식이기 때문에 클래스의 인스턴스가 필요하지 않습니다.다음과 같은 형태로 사용하면 됩니다. CFile::Rename(_T("OldName"), _T("NewName")); .. 더보기
Memory Mapped File(MMF)를 이용한 프로세스간 메모리 공유 Win32 이상의 환경에서는 프로세스의 주소 공간이 독립적으로 관리됩니다.프로세스의 주소 공간이 독립적이기 때문에 다른 프로세스의 주소 공간을 공유할 수 없습니다.A라는 프로세스의 0x1234라는 주소값은 B라는 프로세스의 0x1234와는 전혀 다른 공간입니다.이런 메모리 관리 구조는 OS를 좀 더 안정적이고 견고하게 만들었습니다.그렇지만 각각의 프로세스 사이에서 정보를 주고 받는 것이 어렵게 되었습니다.프로세스 사이에 정보를 공유하기 위해서 Memory Mapped File(MMF)이라는 방식을 사용합니다.이름 그대로 파일을 메모리에 맵핑하기 위해서 사용하는 기법입니다.간단하게 설명하자면, 파일을 열어서 해당 파일을 메모리에 맵핑시켜서 사용하는 것입니다.MMF를 이용해서 하드디스크의 파일을 프로세스의 .. 더보기
특수한 폴더의 경로를 알아오기 Windows를 사용하다보면, 특수한 폴더들이 몇 군데 있습니다.일단 대표적인 게 Windows가 설치된 폴더, System 폴더가 있습니다.바탕화면 폴더, 폰트 폴더 등도 특수한 폴더에 속합니다.이러한 폴더 주소는 사용자마다 다를 수 있기 때문에 프로그래밍시에 직접 넣는 것은 위험할 수 있습니다.쉘 함수 중에 이런 특수한 폴더의 경로를 알아내는 함수가 존재합니다. HRESULT SHGetSpecialFolderLocation(HWND hwndOwner, int nFolder, PIDLIST_ABSOLUTE *ppidl) SHGetSpecialFolderLocation() 라는 함수입니다.첫 번째 인자는 미래를 위해서 예약된 인자이므로 NULL을 넣어줍니다.두 번째 인자가 가장 중요한 부분인데 원하는 폴.. 더보기