본문 바로가기

Programming

MFC에 Flash ActiveX 올리고 에러 발생 FormView에 Flash ActiveX 컨트롤을 올렸을 때 실행이 되지 않는 문제가 있었습니다.이전 버전의 Visual Studio에서는 디버그 모드에서 ASSERT에서 문제가 생겼습니다.Visual Studio 2015에서는 다음과 같은 문제가 발생했습니다.문제가 생기는 부분이 이상한 곳이기 때문에 찾기가 어려웠습니다. AfxOleInit() 함수를 호출하는 부분에서 에러가 발생합니다.MSDN을 통해서 관련 내용을 확인할 수 있었습니다.CoInitializeEx()를 호출할 경우에 COINIT_APARTMENTTHREADED를 사용하라는 것이었습니다.호출할 때 COINIT_MULTITHREADED로 호출했기 때문에 발생한 문제였습니다.CoInitializeEx()를 호출할 때 COINIT_APART.. 더보기
Dialog 내부에 FormView 추가하기 Dialog를 생성하고 내부의 화면만 계속 변경하고 싶을 때가 있습니다.예를 들자면 Visual Studio에서 제공하는 환경설정 메뉴같은 경우입니다.좌측의 트리 형태의 메뉴를 선택하면 우측이 변경되는 모습을 확인할 수 있습니다. 이것을 구현하기 위해서 FormView 활용하는 방법을 고려할 수 있습니다.FormView는 Dialog과 유사하게 다른 컨트롤을 추가해서 사용할 수 있는 View입니다.필요에 따라 FormView를 작성하고 교체하는 방법을 사용하면 됩니다.먼저 MFC 프로젝트를 생성합니다.Dialog based로 변경하고 그 외에 필요한 설정을 합니다.나머지는 기본 설정으로 그냥 두고 생성하도록 하겠습니다.기본 Dialog에 버튼 2개를 추가합니다.이 버튼을 누르면 각각 다른 FormView.. 더보기
[C++11] Storage class specifiers에 thread_local 추가 Storage class specifiers는 기존에 register, static, extern, auto가 존재했습니다.auto는 의미가 없기 때문에 C++11에서는 다른 용도로 사용됩니다.2014/12/10 - [Programming/C++11&14] - [C++11] auto 키워드C++11에는 thread를 지원하기 위해서 thread_local이 추가되었습니다.TLS(Thread Local Storage)를 지원하기 위해서 사용됩니다.하나의 변수를 선언하면 각각의 thread에 별도로 적용됩니다.thread_local은 Visual Studio 2013은 지원하지 않고 Visual Studio 2015부터 지원합니다.thread_local은 다음과 같이 사용하면 됩니다. #include #in.. 더보기
pickle을 활용한 객체 직렬화/역직렬화 객체의 내용과 형태를 그대로 파일에 저장하고 불러오게 하고 싶을 때 pickle 모듈을 사용합니다.객체의 직렬화를 통해서 객체의 내용을 그대로 파일에 저장할 수 있습니다.그리고 저장된 객체는 다시 역 직렬화를 통해서 그대로 다시 값을 복원할 수 있습니다.방법은 간단합니다.먼저 직렬화를 하는 방법은 다음과 같습니다. import pickle data = [{"Apple":1}, 5, ("C", "C++", "Python", "Java")] f = open("D:\\data.bin", "wb") pickle.dump(data, f) 간단하게 파일을 쓰기 모드로 열고 객체를 pickle.dump()로 저장할 수 있습니다.파일을 열어보면 중간중간 Apple이나 Python 같은 문자를 확인할 수 있습니다.역직렬.. 더보기
SDI(or MDI)에서 View를 포함하는 Dialog 띄울 때 문제점 SDI 형식에서 View를 포함하는 Dialog를 생성하면 문제점이 발생합니다.먼저 메뉴를 클릭하면 다이얼로그가 DoModal()을 통해서 생성이 됩니다.DoModal()로 생성된 다이얼로그 내부에서 CView나 CView를 상속한 뷰를 생성해서 포함시킵니다.다이얼로그 내부에서 뷰를 컨트롤처럼 추가하는 것입니다.이렇게 했을 때 다이얼로그의 내부 뷰 영역을 마우스로 클릭하면 문제가 발생합니다. ASSERT(pParentFrame == pDesktopWnd || pDesktopWnd->IsChild(pParentFrame)); 바로 위와같은 ASSERT문에 걸리게 됩니다.문제의 원인은 다음과 같습니다.SDI 형태는 MainFrame이 있고 그 안에 View가 들어갑니다.MainFrame에 바로 붙는 View.. 더보기
파이썬으로 파일의 MD5, SHA-1 해시(Hash) 값 구하기 파이썬으로 MD5나 SHA-1 등의 해시값을 구하는 것은 간단합니다.hashlib의 기능을 사용하면 간단하게 값을 구할 수 있습니다.먼저 hashlib를 import 합니다. import hashlib 그리고 파일을 열어 줍니다. f = open("d:\\test.txt", "rb") 마지막으로 다음과 같이 입력하면 16진수로 표현된 SHA-1값을 얻을 수 있습니다. hashlib.sha1(f.read()).hexdigest() 다만 이 방법으로는 큰 파일의 해시값을 구할 수가 없기 때문에 다음과 같이 하면 됩니다. import hashlib def sha1_for_largefile(filepath, blocksize=8192): sha_1 = hashlib.sha1() try: f = open(file.. 더보기
[C++11] std::mutex를 통한 thread 동기화 2015/06/28 - [Programming/C++11&14] - [C++11] thread 지원 - future를 통한 return값 획득 (2)이미 대부분의 OS는 동기화를 위한 다양한 장치가 마련되어 있습니다.thread가 C++11에서 직접 지원하면서 동기화를 위한 std::mutex가 추가되었습니다.헤더는 이며 사용 방법은 다음과 같습니다. #include #include #include std::mutex mtx; void ThreadFunc(int nID, int& nVal) { for (int i = 0 ; i < 5 ; ++i) { mtx.lock(); std::cout 더보기
[C++11] thread 지원 - future를 통한 return값 획득 (2) 2015/06/27 - [Programming/C++11&14] - [C++11] thread 지원 (1)C++11의 thread에서 return으로 결과를 받는 방법입니다.결과를 받는 방법은 약간 복잡할 수 있습니다.먼저 std::promise라는 클래스 템플릿이 추가되었습니다. 헤더에 추가되어 있습니다.promise는 값이나 예외를 저장할 수 있는 기능을 가지고 있습니다.그리고 promise 객체를 통해서 생성되는 std::future를 통해서 나중에 결과를 얻을 수 있습니다.기본적인 코드는 다음과 같습니다. void ThreadFunc(std::promise& retVal) { retVal.set_value(1); } int main() { std::promise p; auto f = p.get_f.. 더보기