'MFC'에 해당되는 글 2건

  1. 2008.04.19 [MFC] 비트맵 파일 저장 3
  2. 2007.02.23 [MFC] EXE->DLL 호출에서 CString 리턴받고 싶을 때 2


 BITMAPFILEHEADER bmFileHeader;
 BITMAPINFOHEADER bmInfoHeader;

 // BMP 헤더
 bmFileHeader.bfSize  = sizeof(BITMAPFILEHEADER);
 bmFileHeader.bfType  = 0x4D42;
 bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
 
 bmInfoHeader.biSize    = sizeof(BITMAPINFOHEADER);
 bmInfoHeader.biWidth   = 320; // 너비
 bmInfoHeader.biHeight   = 240; // 높이
 bmInfoHeader.biPlanes   = 1;
 bmInfoHeader.biBitCount   = 24; // 색상 비트
 bmInfoHeader.biCompression = 0;
 bmInfoHeader.biSizeImage = bmInfoHeader.biWidth * bmInfoHeader.biHeight * (bmInfoHeader.biBitCount/8);

 bmInfoHeader.biXPelsPerMeter = 0;
 bmInfoHeader.biYPelsPerMeter = 0;
 bmInfoHeader.biClrUsed = 0;
 bmInfoHeader.biClrImportant = 0;

 // BMP는 아래에서 위로 저장되는 형식이기 때문에 순서대로 저장하면 뒤집히므로 파일로 저장할 데이터를 뒤집기
 SPixel* rgbTemp = new SPixel[BUFSIZE]; // 파일저장할 데이터를 보관할 임시공간
 for(int i=0; i<BUFSIZE; i++) {
  rgbTemp[i].r = g_rgb[BUFSIZE-1-i].r;
  rgbTemp[i].g = g_rgb[BUFSIZE-1-i].g;
  rgbTemp[i].b = g_rgb[BUFSIZE-1-i].b;
 }

 // 파일로 저장
 CFile file;
 file.Open(_T("파일명"), CFile::modeNoTruncate | CFile::modeCreate | CFile::modeReadWrite );
 file.Write(&bmFileHeader, sizeof(BITMAPFILEHEADER));
 file.Write(&bmInfoHeader, sizeof(BITMAPINFOHEADER));
 file.Write(rgbTemp, bmInfoHeader.biSizeImage);
 file.Close();
 
 delete rgbTemp;

 AfxMessageBox(strFilename + _T("\nwas saved"));

Posted by freezn
상황은 AFX DLL 을 사용하는 EXE에서 문자열을 리턴받고 싶을 때 이다.

Want :
// EXE에서 이런 형태로 사용하고 싶었다.
CString str = myDllClass.ToString();
//or... 좀 번거롭지만 이렇게라도 굳이 쓰고 싶었다.
CString str;
myDllClass.ToString(str);

So I Was : (Wrong)
CString ToString()
{
    return _T("merong~");
}
// and
void ToString(CString& str)
{
    str = _T("merong~");
}


이렇게도 해봤는데

릴리즈모드로 빌드한 EXE를 실행시 에러가 나지 않지만 디버그모드로 빌드한 EXE에서는
 
Error on Excute :
dbgheap.c
Line: 1044
Expression : _CrtlsValidHeapPointer(pUserData)
...

뭐 이런 에러가 나더라

찾아보니까 빌드시 DLL 의 CString 과 EXE의 CString 이 다르기 때문(자세한건 에러로 구글링해보면 나온다.) 이라는 결론이 나왔다.

곧 죽어도 CString 을 LPSTR로 변환시켜서 쓰고 싶진 않았던 터라 (그러기 싫어서 굳이 CString 따위를 사용했다)
const 도 여기저기 붙여보는 뻘짓을 했다.

CString 은 묵시적으로 LPCTSTR 로 변환이 가능하지?

그럼 굳이 const 인 LPCTSTR 을 LPSTR로 변환하지 않고도 사용할 수 있는건데...

결국 결론은 간단했다.

Right :
// AFX DLL 에서의 선언:
LPCTSTR ToString() {
    return _T("merong~");
}

// EXE 에서의 사용
CString str = myDllClass.ToString();



만세.

이걸 해결 못해서 하루 종일 낑낑댄 나는.... OTL

오늘의 교훈.
절대로 CString 을 써야만 하는 상황이 아니면 이따위것 쓰지 말자.
Posted by freezn