본문 바로가기

Library/Windows Programming

CygWin Portable Install 윈도우에서 가상 머신을 사용하지 않고 유닉스 환경을 사용하는 방법 중 가장 대표적인 것은 CygWin이다. CygWin은 cygwin1.dll을 사용해서 POSIX 함수들을 구현하기 때문에, 많은 유닉스 프로그램들을 그대로 컴파일해서 사용할 수 있다. CygWin와 자주 비교되는 MSYS는 사실 CygWin에서 파생된 프로젝트다. CygWin이 호환성을 최우선으로 하는 것과 달리, MSYS는 윈도우 환경에서 GNU 툴들을 사용할 수 있도록 호환성을 제공하기는 하지만, 성능을 우선하고 있다는 점이 다르다. 호환성을 중요하다면 CygWin을, 호환성을 약간 희생하고 좀 더 높은 성능을 필요로 한다면 MSYS이 적당하다. MSYS가 CygWin보다 설치가 간단하고 성능도 괜찮지만 여전히 CygWin이 필요한 .. 더보기
CShellFileOpenDialog / CShellFileSaveDialog 사용하기 WTL의 CShellFileOpenDialog / CShellFileSaveDialog는 비스타 이상에서 지원되는 대화상자 컨트롤이다. 이들은 전통적인 대화 상자와 달리, 탐색기과 같은 스타일을 가진다. CShellFileOpenDialog / CShellFileSaveDialog를 사용하려면 WTL의 atldlgs.h를 먼저 포함해야 한다. 이 대화 상자들이 인스턴스화 될 때 플랫폼이 비스타 이상이 아니라면, 인스턴스의 m_spFileDlg는 널(null)이다. 플랫폼이 비스타가 아닐 수도 있다면, 윈도우 버전을 확인하는 절차가 필요할 것이다. 이들은 고전적인 대화 상자와 달리 CShellMultiFileOpenDialog와 같은 클래스가 존재하지 않으며, COM 인터페이스를 사용하여 대화 상자를 조정.. 더보기
MSYS Portable Install using MinGW MSYS는 시그윈(Cygwin)과 비슷하게, 윈도우 환경에서 최소한의 유닉스 시스템을 구성해준다. 시그윈이 유닉스 레이어를 구성하는 dll를 가지는 방식으로, 최대한의 호환성을 제공하는 것과 달리, MSYS는 최대한 유닉스 시스템과 호환성을 가지면서도 성능을 우선시한다. 즉, 생성되어 나오는 바이너리가 레이어를 거쳐 실행되는 시그윈과 달리, 직접적으로 윈도우 바이너리를 생성한다. 그러나 실행 성능은 좋다고는 할 수 없다. MSYS의 가치는, 수많은 유닉스 기반 프로그램들을 직접 컴파일할 수 있도록 해준다는데 있다. 유닉스 프로그램들은 주로 automake, autoconf와 같은 툴을 이용하여 배포되기 때문에, ./configure 스크립트를 처리할 수 있는 환경이 아니라면 프로그램이 이식성을 염두에 두.. 더보기
DirectX SDK June 2010 Release DirectX SDK가 Feb 2010 이후로 새롭게 릴리즈되었다. DirectX 10 세대에서는 오랫동안 큰 변화가 없었는데, DirectX 11 세대에 이르러서는 다시 빠르게 발전되고 있는 느낌이다. 이번 June 2010 릴리즈에서 가장 눈길을 끄는 것은 새로운 HLSL 명령어의 추가이다. 가장 흥미있는 것은 printf, errorf, abort 명령어의 추가이다. 지금까지는 쉐이더 코드의 변수 값을 알아내기 위해서는 외부 디버거를 사용하여 쉐이더 코드 내의 값들을 파악할 수 밖에 없었다. 그런데, 이번에 새로 포함된 HLSL 명령어인 printf, errorf는 Information 큐에 값을 출력할 수 있게 되었다. 이것으로, 좀 더 쉽게 쉐이더 코드를 디버깅할 수 있게 되었다. 이 기능은 쉐.. 더보기
BMP 디코더를 작성할 때 주의점 : 스캔 라인 바이트 정렬 비트맵 이미지를 다루기 위한 API가 준비되어 있는 플랫폼에서 비트맵을 처리하는 것은 매우 간단하다. 또, 플랫폼의 지원보다 더 좋은 이미지 프로세싱이 필요하다면, 외부 이미지 라이브러리를 사용하면 된다. FreeImage, ImageMagick, CxImage, DevIL 등은 잘 구현된 공개 이미지 라이브러리들이며, 이외에도 쓸만한 라이브러리들을 쉽게 찾을 수 있다. 이들을 사용하여 이미지를 읽어들이거나 필터링을 적용하는 것만 목적이라면, 사실 비트맵 이미지들의 내부 구조를 파악할 필요는 없다. 그러나, 이런 지원이 없거나 주로 사용하던 이미지 라이브러리가 해당 플랫폼에서 컴파일되지 않는다면, 이미지 파일 구조를 직접 읽어들이는 고통스러운 작업이 필요하며, 파일 내부 구조에 대한 이해가 필수적이다. .. 더보기
Visual Studio 2010 : Happy New Start! 드디어 기다리고 기다리던 Visual Studio 2010이 출시되었다. C/C++ 기반 개발자들에게 무엇보다 반가운 것은 C++0x의 지원에, PPL(Parallel Pattern Library) 지원이 추가된 것이다. MFC 지원 강화는 사실 BCG 소프트웨어의 리본 툴킷을 가져온 것이고, MFC는 아직 현역이긴 하지만 설계 구조가 시대에 한참 뒤떨어져 있어 Visual C++이 점점 입지가 약화되는게 아닌가 우려가 많았다. 보다 근본적으로 C/C++ 강화가 절실했는데, 이번 Visual Studio 2010은 C/C++ 개발자들에게 환영할만한 선물이 될 것으로 보인다. C++0x 지원은 사실 새로운 것은 아니다. Visual Studio 2008에서도 tr1 라이브러리를 지원하고 있었기 때문이다. .. 더보기
Direct2D : Your New Windows 2D Rendering API 윈도우 1.0이 세상에 나온지 25년이 지났지만, 아직도 초기와 비교해 크게 달라진 것이 없으며, 현역으로 사용되고 있는 것을 꼽으라면 단연 GDI일 것이다. GDI는 XP까지도 윈도우의 2D 프레젠테이션 엔진이었고, GDI+라는 확장된 버전이 작성되기도 했지만 근본적으로 2D 클리핑 기반 엔진이라는 한계를 가지고 있었다. GDI는 윈도우를 서로 겹칠 때 그 단점을 가장 뚜렷하게 관찰할 수 있다. 예를 들어 투명 효과를 구현하다면 복잡한 일이 될 수 밖에 없다. 직접 전체 화면에 대한 DC를 얻어내어 해당 위치에 대한 픽셀값을 계산해야 했기 때문이다. 또, 근본적으로 래스터라이즈된 이미지를 기반으로 동작하기 때문에, 확대, 축소 시에 이미지 손실이 발생한다. .NET에 탑재된 WPF는 벡터 기반으로 작성.. 더보기
WTL::CFileDialog, WTL::CMultiFileDialog MFC에서 복수 파일을 선택하여 열기 / 저장을 하기 위해서는, CFileDialog 개체를 생성한 뒤, OFN_ALLOWMULTISELECT 플래그를 지정해야 한다. 그리고, OPENFILENAME 구조체의 lpstrFile에 선택한 파일들이 들어갈만한 충분한 버퍼를 할당해야 한다. OFN_ALLOWMULTISELECT 플래그를 지정했다고 하더라도, 할당한 버퍼의 크기가 충분하지 않으면 기대한 파일 목록을 얻지 못한다. 또, 이 파일들의 경로 따위를 얻어내기 위해서는 POSITION 구조체에 대해서 반복자를 적용하여 값을 얻어내야 하는데, 사실 Win32 API를 직접 사용하는 것보다 크게 나을 것이 없다. 무엇보다, POSITION 구조체에 반복자를 적용하는 것은 그렇다고 하더라도, 직접 버퍼를 할당.. 더보기
vsperfcmd : Visual Studio 2008 Standalone Profiler 코드를 최적하는데 가장 필수적인 도구는 프로파일러다. 프로파일러는 어느 함수가 얼마나 많이 호출되었는지, 어느 정도의 수행 시간을 점유하는지 따위를 파악할 수 있도록 해주는 도구인데, 프로그래머라면 실제로 써본 적은 없더라도 이름은 많이 들어보았을 것이다. 유닉스 플랫폼에서 코드를 작성하고 있다면, 유닉스 컴파일러 시장은 이미 gcc가 대세를 이루고 있으므로 GNU Profiler라는 좋은 툴을 무료로 사용할 수 있다(GNU는 가난한 프로그래머에게 신의 축복이다). 그러나, 역시 중요한 플랫폼 중 하나인 윈도우에서는 Visual Studio와 잘 맞는 프로파일러를 구하기가 쉽지 않다. 물론, Visual Studio Team Suite 버전이라면 Visual Analyzer가 IDE에 포함되어 있기 때문.. 더보기
비스타 이상에서 사운드 출력 레벨 설정하기 웨이브 출력 레벨을 설정하는 waveoutGetVolume, waveoutSetVolume은, XP까지는 잘 통용되는 방법이었지만 비스타 이상에서는 제대로 동작하지 않는다. 비스타 이상에서는 사운드 출력을 관리하는 믹서의 구성이 좀 더 복잡해졌기 때문에, waveout 관련 API를 호출해보면 MMSYSERR_NOTSUPPORT와 같은 에러를 받을 것이다. 이들 윈도우는 응용 프로그램 각각에 대해서 오디오 믹서 조절이 가능해졌는데, 사용자들에게는 다채로운 기능이지만 개발자에게는 약간 고달퍼진 셈이다. 그렇지만 조금 귀찮아졌을 뿐 사운드 출력 레벨 설정은 어렵지 않다. 사운드 출력 레벨을 조절하고 싶다면 다음 과정을 처리해주면 된다. COM 인터페이스를 사용해야 하는게 기존과 조금 달라진 부분이다. 먼저,.. 더보기