본문 바로가기

c

(18)
STL C/C++ 에서 자동 Locale 설정 하기. MinGW-W64 가 버젼이 올라 감에 따라 다국어 처리도 강화 되고 있습니다만, 표준 C/C++ 에서 자동으로 한국어 또는 구동되는 OS 에 맞게 std/stl 의 locale 설정을 하고 싶어서 아래 코드 처럼 만들었습니다. 물론 이는 Windows 에서만 해당 하는 부분이며, 사용을 위해서는 와 를 #incldue 로 넣어 주어야 합니다. void procLocale() { #ifdef DEBUG printf("### AUTO LOCALE SET @ WINDOWS ###\n"); #endif ⁄⁄⁄ of DEBUG LCID currentLCID = GetSystemDefaultLangID(); wchar_t currentLoc[LOCALE_NAME_MAX_LENGTH] = {0}; char conv..
MinGW-W64, CPU 명령어 빌드에 맞춰 구동 테스트 하기. 만약 MinGW-W64 (또는 일반 MinGW) 에서 -mavx 또는 -march=corei7-avx 와 같은 빌드를 지시해서 만든 바이너리를 배포 하는데, 만약 이를 구동하는 PC 가 AVX 관련 명령어를 지원 하지 않는 환경에서 해당 바이너리를 구동하면? 이럴 경우 해당 바이너리는 그냥은 구동이 되나, AVX 관련 명령어가 실행 되는 위치에서 exception 을 뱉고, 해당 callstack 은 이전 pc 로 돌아가나, 여기서 문제가 발생 해서 함수 자체가 멍청이가 됩니다. 그래서 배포한 바이너리가 내가 빌드한 환경과 자동으로 구동 될 PC 에서의 환경과 맞는지를 간단히 테스트 할 수 있는 방법을 gcc 는 물론 MinGW 역시 지원 합니다. 이를 확인 하기 위해서는 먼저 #include 에 를 넣..
MinGW 에서 pthread 와 빌드시 time 구조체 오류 날때. MinGW 에서 빌드를 할때 특정 라이브러리를 M-Sys 를 통해 빌드 하다 보면 다음 오류를 볼 경우가 많습니다. error: redefinition of 'struct timespec' 이런 경우는 대부분 pthread 내에 다음과 같이 정의 되어 있는걸 확인 해 볼 수 있습니다. #if !defined(HAVE_STRUCT_TIMESPEC) #define HAVE_STRUCT_TIMESPEC #if !defined(_TIMESPEC_DEFINED) #define _TIMESPEC_DEFINED struct timespec { time_t tv_sec; long tv_nsec; }; #endif ⁄* _TIMESPEC_DEFINED *⁄ #endif ⁄* HAVE_STRUCT_TIMESPEC *⁄ 해..
HTTP/1.1 의 POST 때문에 살짝 고민한 문제 .... 이전에 만든 HTTP/1.0 용 socket source 를 POST 까지 되도록 버그를 수정 하면서 HTTP/1.1 으로 호환되게 변경 하다 보니 알수 없는 문제를 격었습니다. 바로 해당 서버(Apache2 + PHP5) 에서 $_POST[x] method 를 이용해서 넘어 온 것이 없는 듯이 인식 한다는 점 이었습니다만, 여러번의 시도 중 다음 header 인자가 중요하다는 것을 알았습니다. 바로 Content-Type 이 문제 였습니다. PHP5 에서 제대로 POST 되는 내용을 알려면 Content-Type 을 application/x-www-form-urlencoded 로 써야 인식을 하는 것 이었습니다. 기존엔 text/html 로 mime 을 지정해서 보냈더니 이걸 인식 못하는 문제를 이제 ..
[FLTK] Win32/X11 에서 FLTK 고속 rednering (또는 redraw) FLTK 에서는 사실상 Fl::check(); 나 Fl::wait(); 등으로 화면을 갱신 하는 방법이 있습니다. 하지만 이 방법을 사용할 경우 잘못된 화면 출력이나 프로그램 자체가 멈추는 문제가 발생되는 단점이 있습니다. 실질적으로 FLTK 는 강제적인 redraw 를 할수 있는 조건을 FLTK 자체가 결정 하는 구조이며, Windows 에서는 비활성화 된 Window 에서는 1초에 한번 그리는 경악적인 상태로 바뀝니다. 문제는 활성화 된 상태 이더라도 Fl_Window 객체를 아무리 redraw(); 하더라도 갱신은 "니 맘대로 되는것이 아니란다" 라는 단점이 있습니다. 이를 해결 하기 위해 여러 방법을 찾다가 문듯, 활성화된 FLTK Window 위에서 마우스를 계속 움직이면 고속으로 화면이 갱신 ..
[FLTK] Fl_RGB_Image 로 부터 회전된 이미지 얻기. FLTK 는 여러 플랫폼에서 간단하면서 깔끔한 UI 를 만들기에 매우 좋은 GUI library 입니다만, 기본 기능에만 기준을 두고 있다 보니 이미지 처리 ( 리사이즈나 회전 등 ) 는 없는 것이 아쉬운 부분 입니다. 이번의 경우는 이미지를 회전 시켜 표시 해야 하는 경우 (위 이미지 처럼 뭔가 열심히 일 하고 있으니 기다려 주십사~ 하는) 기본으로 그리는 수준으로는 깔끔한 이미지를 얻기 힘듭니다. 이를 개선 하기 위해 구글링 중 CodeGuru 에서 이미지 회전에 관한 글 을 찾았습니다. 그리고 이를 응용하여 다음과 같은 API 를 만들어 보았습니다. #include #ifndef M_PI #define M_PI 3.141592654 #endif ⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄..
Porcess ID 로 해당 윈도우의 HWND 를 얻고 BMP 로 저장. 윈도우 프로그래밍을 하다보면 가끔 다른 윈도우의 화면을 갈무리 해야 하는 경우가 생깁니다. (Capture 처럼) 이럴때 아래의 코드 중 HWND GetHandleFromPID(DWORD pid); 함수를 사용하면 간단히 해당 프로그램의 HWND 를 얻을 수 있습니다. #include #include "winproc.h" typedef struct _ProcessCallbackData { DWORD m_pid; HWND m_hwnd; } ProcessCallbackData; BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam) { DWORD pid = 0; ProcessCallbackData *pcbd = (ProcessCallbackData *)lParam; if ( ..
Windows API, 윈도우 에서 Drag Drop 으로 파일 목록 받기. 간단히 Windows 에서 파일을 Drag&Drop 으로 받는 방법들을 쓰는 프로그램들이 더러 있습니다. 이를 Windows API 로만 처리 하려면 다음과 같은 코드가 필요 합니다. 먼저, DragAcceptFiles() API 로 이벤트를 받을 Windows Handle 을 등록 합니다. DragAcceptFiles( hWindow, TRUE ); 이는 최초 WM_CREATE 부분에서 처리하는 방법을 써도 되나, 부분적으로 해당 이벤트를 받지 않고 싶을때 FALSE 대입으로 처리 할 수도 있습니다. 해당 이벤트는 WinMain() 에서 WM_DROPFILES 로 넘어 오게 됩니다. 이때 취해야 하는 인자는 wParam 으로 다음과 같이 처리 할 수 있습니다. BOOL CALLBACK DialogPro..