윈도우즈 모바일 5 부터 사용할 수 있다고 하지만 그 전에도 undocumented function 으로 사용가능 했던 것 같습니다.(구글신 검색결과)
// 사진 파일을 지정
HBITMAP h = ::SHLoadImageFile(filename);
if(h != NULL) {
m_photoImage.Attach(h);
}
else {
MessageBox(_T("사진 파일을 불러오지 못했습니다."), _T("Me2PocketUploader"), MB_ICONWARNING);
}
용량이 큰(실험 결과 1Mbyte 정도) 이상의 파일을 SHLoadImageFile로 로드하면 무조건 NULL이 리턴되었습니다.
GetLastError로 조사해도 핸들이 잘못되었다는 메시지만 출력합니다. 어리 둥절했던 것은 에뮬레이터에서는 불러오다가 못불러오다가 했습니다. 생각해보니 메모리 용량 때문인거 같습니다. JPG파일 200kb 정도라도 실제 BITMAP으로 디코딩 될때의 메모리 점유는 3Mbyte에 육박 했습니다. 그래서 구글신께 여쭈어서 찾고 찾은것이 Windows CE의 Image API 입니다.
Me2PocketUploader 윈도우즈 모바일 버전을 개발하면서 마블(이전은 인텔)의 PXA시리즈 CPU에서는 잘 동작하는 기능이 퀄컴의 MSM시리즈(MSM7200)칩에서는 의도하지 않은 동작을 하였습니다. 어차피 둘다 태생은 ARM 아키텍처 이지만 말입니다. 그것도 무적전설님이 알려주기 전까지는 몰랐습니다.
문제의 코드는 다음과 같습니다.
setCloseCommnet 값이 BOOL값이라 BOOL값은 또 int로 정의되어 있기에 저렇게 작성했었는데, 퀄컴의 MSM CPU에서는 계속 댓글이 닫히는 문제가 생기는 것입니다. setCloseCommnet값이 FALSE라도 실행이 되어버렸던 것이지요. 전 이문제를 단순히 CPU의 아키텍처가 틀려서 라고 생각을 하고 있다가, 다음과 같이 명확하게 TRUE값을 검사했습니다.