지금 방금 있었던 일.
dkErr CAxStoryBoardCtrl::makeThumbnail(BSTR BinItemURN,HBITMAP *hbitmap,int Width,int Height,dkTime nPos /*= -1*/)
{
HRESULT hr;
char * pBuffer = NULL;
hr = m_pCaptureFrame->SaveVideoPictureToFile(BinItemURN, L"C:\\a.bmp", nPos, Width, Height);
if (FAILED(hr))
{
AfxMessageBox("비디오 저장 실패");
return hr;
}
hr = m_pCaptureFrame->GetVideoPicture(BinItemURN, nPos, Width, Height, &pBuffer);
if (FAILED(hr))
{
AfxMessageBox("비디오 가져오기 실패");
return hr;
}
// 비트맵에 헤더입히기
// 현재 가져온 pBuffer에서 앞부분의 비트맵 해더 부분을 가져온다.40byte의 크기이다.
BITMAPINFOHEADER *pBmih = (BITMAPINFOHEADER*)pBuffer;
pBmih->biCompression = BI_RGB;
pBmih->biSizeImage = ((pBmih->biWidth * pBmih->biBitCount + 31) & ~31) / 8 * pBmih->biHeight;
// 실제 RAW Bitmap 데이터 위치 찾아내기
// 실제 위치는 현제 pBuffer의 주에 해더의 크기를 더하면 나온다.
// +-----------------------+ <-pBuffer의 주소이다.
// + 해더 +
// + +
// +-----------------------+ <-해더의 크기를 pBuffer주소에 더하면 실제 데이터위치를 찾을수 있다.
// + +
// + 데이터 +
// +-----------------------+
void *pDIBData = pBuffer + pBmih->biSize;
// BITMAPINFO를 만들어낸다.
// 왜? CreateDIBitmap에 인자값으로 들어가니까.
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(BITMAPINFO)); //구조체를 초기화 한다.
CopyMemory(&(bmi.bmiHeader), pBmih, sizeof(BITMAPINFOHEADER)); //bmi 구조체에 pBmih값을 복사한다.
// 비트맵을 HBITMAP으로 만든다.
HDC hdc = ::GetDC(0);
*hbitmap = CreateDIBitmap(hdc, pBmih, CBM_INIT, pDIBData, &bmi, DIB_RGB_COLORS);//bitmap생성
if (pBuffer)
delete pBuffer;
return S_OK;
}
위 함수에서 에러가 난다. 그것도 Debug 모드일때만. Release 모드에서는 전혀 에러가 안나고 잘 지나간다.
이유를 찾기 힘들었는데, 결론은 다음과 같다.
저 pBuffer를 넘기는 atlMediaInfo라는 atl COM모듈이 있는데, 현재 연결되어 있는게 release 모드에서 생성된 atlMediaInfo.tlb 파일이었다. 그래서 Debug 모드일때는 Debug 모드에서 생성된 atlMediaInfo.tlb 파일을 연결해 주었더니 release 모드일 때와 debug 모드일 때 모두 잘 되었다.
#ifdef _DEBUG
#import "E:\D2NET\project\Herb\trunk\bin\atlMediaInfoD.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search
#else
#import "E:\D2NET\project\Herb\trunk\bin\atlMediaInfo.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search
#endif
앞으로 모든 debug release 모드를 맞춰줘야겠다.
'프로그래밍 > VC++' 카테고리의 다른 글
ActiveX로 인스톨러 만들기 (0) | 2007.03.08 |
---|---|
CString , BSTR , CComBSTR , CComVariant 간의 자료형변환 (0) | 2007.03.08 |
COleDateTime으로 오늘 날짜 가져오기 (0) | 2007.02.02 |
COM에서 DATE 타입 사용하기 (0) | 2007.02.02 |
switch / case의 이상한 경험 (0) | 2007.01.25 |