프로그래밍/VC++

TLB도 Release, Debug 모드에 맞춰서 Import 하자.

panpro 2007. 2. 23. 17:43

지금 방금 있었던 일.

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 모드를 맞춰줘야겠다.