상황은 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