본문 바로가기

C / C++ / Win32 / MFC

CFileDialog 에서 "내컴퓨터"를 초기 폴더로 지정하기 CString sf_GetComputerDir() { IMalloc *pShellMalloc = NULL; IShellFolder *psfParent; LPITEMIDLIST pidlItem = NULL; LPITEMIDLIST pidlRelative = NULL; STRRET str; WCHAR szDisplayName[MAX_PATH] = L""; WCHAR szPath[MAX_PATH] = L""; HRESULT hres = SHGetMalloc(&pShellMalloc); if (FAILED(hres)) return _T(""); hres = SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidlItem); if (SUCCEEDED(hres)) { hres .. 더보기
Excel 파일을 SQLite로 변환 1. 엑셀에서 유니코드 택스트 형식으로 저장합니다. (Tab Separated 형식으로 저장됩니다.) 2. Visual Studio에서 1의 텍스트 파일을 엽니다. 3. Replace 메뉴로 \t를 | 로 모무 변경합니다. (Regular expressions 를 사용하면 \t 를 변경할 수 있습니다. 4. Advanced Save Option 메뉴를 선택하여 Encoding을 Unicode (UTF-8 without signature) - Codepage 65001로 선택하고 Line endings를 Windows (CR LF)로 선택한 다음 저장합니다. 5. SQLite 커맨드 명령어 .import를 이용하여 택스트 파일을 디비로 임포팅합니다. (물론 엑셀 데이터 스키마에 맞는 테이블이 생성되어 있어.. 더보기
미니덤프를 이용하여 디버깅하기 불측정 다수가 사용하는 소프트웨어를 개발하다 보면 그 환경이 너무나도 다양해서 예상치 못한 에러들이 많이 발생하곤 합니다. 이러한 에러 중 try... catch... 로도 잡아내지 못하는 메모리 포인트 오류가 발생했을 때 미니덤프 파일을 생성시켜 이 파일을 이용하여 어디서 프로그램이 오류가 났는지 알 수 있으며 상황에 따라 다르겠지만 Call Stack 과 변수값까지도 알 수 있습니다. 예기치 않은 메모리 오류 발생시 다음의 코드로 미니 덤프를 생성하도록 할 수 있습니다. #include LONG __stdcall Exception_Minidump(_EXCEPTION_POINTERS* pExceptionInfo) { TCHAR fileName[MAX_PATH] = {0,}; _tcscpy(fileNam.. 더보기
IWebBrower의 DocumentComplete 이벤트에서 마지막 호출인지 검사하기 void CDlgWebPopup::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL) { IUnknown* pUnk; LPDISPATCH lpWBDisp; pUnk = m_cWebBrowser.GetControlUnknown(); pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp); if(pDisp == lpWBDisp) { // 마지막 이벤트 } lpWBDisp->Release(); } 보통의 웹페이지는 프레임을 포함하고 있기 때문에 페이지 로딩시 DocumentComplete가 여러 번 호출됩니다. DocumentComplete 이벤트는 최상위의 웹브라우저 윈도우에 대해 마지막으로 호출됩니다. IWebB.. 더보기
비스타에서 Visual Studio 2003의 Find in Files 기능 사용하기 본 포스트는 2007/3/29 작성되었습니다. 올해 초 Window Vista가 정식 출시되었습니다. 지나친 리소스의 점유율, 보안 설정에 따른 ActiveX의 동작 문제, 우리나라는 정부 차원에서 비스타 구매를 장려하지 않을 것이다... 등등등... 각종 비스타의 문제와 소문들이 난무하고 있는 상황에서도 XP 기반으로 진행되고 있는 프로젝트 고객들이 비스타의 호환성을 요구하고 나섬으로 인해 응용 소프트웨어 아웃소싱을 담당하고 있는 우리로서는 비스타의 출시를 남의 집 잔치쯤으로만 여길 수 없는 상황입니다. 몇일 전 우리는 콘로 CPU를 탑재한 데스크탑 두 대와 팀원들의 개발장비 메모리를 2기가로 맞추기 위해 메모리를 몇 개 구매하였습니다. 당연히 비스타에 대응하기 위한 시스템 업그레이드 차원에서 구매하였.. 더보기
왜 C/C++인가? 본 포스트는 2006/8/12 작성되었습니다. C/C++를 사용해 온지 15년째 접어 들고 있습니다. 그 옛날 Turbo C를 시작하여 UNIX C, Visual C++에 이르기까지 그 동안 C/C++를 사용해 오면서 C/C++를 사용하면 사용할 수록 정말이지 이만큼 개발자로 하여금 자유로움과 유연성을 제공하는 언어가 또 있을까 하는 생각을 자꾸 하게 됩니다. 안정성과 속도가 중요시 되는 네트워크 서버 시스템에서 부터 화려함과 생동감을 강조해야 하는 멀티미디어와 복잡한 여러가지의 알고리즘들을 연관성 있게 구현하고 다양한 인터페이스를 제공해야 하는 Core 엔진 개발에 이르기까지 주어진 프로젝트에서 강조되는 부분을 개발자 마음대로 쉽게 적용할 수 있기 때문입니다. 물론 제가 C/C++ 골수분자이기 때문에 .. 더보기
프로젝트 폴더 구조 본 포스트는 2006/8/8 작성되었습니다. Visual Studio 에서 프로젝트를 생성하면 빌드의 Output 폴더가 기본적으로 프로젝트가 위치한 폴더에서 Release / Debug 폴더 등으로 세팅됩니다. 소스 아웃소싱을 주로 작업하고 있는 우리 팀에서는 작업된 소스를 수시로 고객사에 메일이나 메신저, FTP 등으로 보내는 일이 허다합니다. 그 때마다 obj 파일들 때문에 압축시간도 길어지고 압축파일 크기도 무시못할 정도로 커지고 해서 obj 파일들과 쓸데없는 파일들을 다 지우고 소스와 실행모듈만 압축해서 보내곤 했습니다. 그러다 보니 메인 실행 파일 외에 관련 DLL 이나 LIB 등의 프로젝트 소스가 많을 경우 해당 폴더로 가서 obj 와 쓸데없는 파일들을 지우기가 아주 귀찮았습니다. 그래서 우.. 더보기
원격 디버깅 (Remote Debugging) 본 포스트는 2006/8/6 작성되었습니다. 지난 7월 마이크로소프트에서는 윈도우98/Me에 대한 지원을 중단하였습니다. 윈도우98/Me에 대한 보안패치를 포함하여 어떤 기술지원도 하지 않는다는 것입니다. 항간에는 윈도우의 최신버전을 팔아먹기 위한 MS의 오만방자한 수작이라고 비난하는 사람도 많지만, 저 역시 소프트웨어 아웃소싱 개발팀을 이끄는 사람으로서 계약기간이 훨씬 지난 프로젝트의 기술지원이나 디버깅이 얼마나 힘든 일인지 잘 알기에 MS의 입장을 충분히 이해합니다. 아마 윈도우 98/Me의 기술지원을 위해서 생각보다 많은 예산이 들어갈 것입니다. (MS에서는 전구 하나를 갈기 위해 수십명의 개발자가 필요하답니다. ^^) 만일 MS가 기존 윈도우 98/Me 사용자에 대해 거의 무료에 가까운 업그레이드.. 더보기
ODBC Error - State:01004 문자열 데이터의 오른쪽이 잘렸습니다. 무시하기 본 포스트는 2006/8/3 작성되었습니다. 작년 10월부터 4개월여간 S은행 기업용 인터넷뱅킹 시스템에 사용되어질 그리드 컴포넌트를 ActiveX로 개발한 적이 있습니다. 그리드의 기본적인 기능은 물론이고 XML / CVS / 엑셀 파일 지원 다중 선택을 이용한 copy / paste 셀편집 컨트롤 지원(Edit / Combobox / Radio / Check / 달력) 사용자 서식 디자인 적용 등등등..... 초보적인 엑셀의 기능이 모두 구현된 300 여개의 메소드를 제공하는 놈이었습니다. 개발이 끝나고 잔금까지 다 받고 6개월이 지난 지금까지 별 문제 없이 그쪽 개발자들이 내가 만든 컴포넌트를 이용해 시스템 개발을 해오고 있었습니다. 한 달에 한 두 건 정도 몇몇 사소한 버그를 처리해주는 것 말고는.. 더보기