본문 바로가기

프로그래밍

(MFC 6.0) CInternetSession::SetCookie의 첫번째 파라미터때문에 발생했던 버그



CInternetSession::SetCookie
Sets a cookie for the specified URL.


static BOOL SetCookie (
 LPCSTR pstrUrl,
 LPCTSTR pstrCookieName,
 LPCTSTR pstrCookieData
)


2번째와 3번째 파라미터는 LPCTSTR형이므로,
비유니코드에서는 char* 형으로, 유니코드에서는 WCHAR*형으로 넣으면 되는 것이다.


하지만, Host 주소가 들어가는 첫번째 파라미터는 LPCSTR......
유니코드인 경우, WideCharToMultiByte를 통해 멀티바이트로 바꿔서 넣어야만 한다????


프로젝트 셋팅에서 2000과 XP의 경우에는 _UNICODE가 Define되어 있는 상태이다.


실험 결과
--------------------------------------------------------------------------------------------------
// 이것은 98, ME, 2000, XP(Debug)
    int nHostLen = strHost.GetLength();
    TCHAR *pSzUrl = new TCHAR[nHostLen+1];
    _tcscpy(pSzUrl, strHost);
    pSzUrl[nHostLen] = '\0';


    session.SetCookie((LPCSTR)pSzUrl, _T("User"), strUser); // TCHAR*를 LPCSTR로 강제 캐스팅
--------------------------------------------------------------------------------------------------
// 이것은 XP(Release)
    char *m_pBuffer = NULL;
    // 코드 중략 했음
    WideCharToMultiByte(m_CodePage, NULL, strHost, strHost.GetLength(), m_pBuffer, nMultiLength, NULL, NULL);


    session.SetCookie((LPCSTR)m_pBuffer, _T("User"), strUser); // 유니코드를 멀티바이트로 변환해야 함
--------------------------------------------------------------------------------------------------


같은 유니코드 환경인 Windows 2000이랑 XP가 반대이며,
더구나, XP는.....Debug 모드랑 Release 모드랑 반대의 상황이!!!!!!!!!!!


원격 디버깅을 해서야 알아냈다.


다행이도 위의 내용을 알아내서, 버그를 해결하긴했지만,
회사에서 밤까지 새는 고통의 억울함이란.............


관련 내용에 대한 자세한 사항을 알고 계시면, 댓글이나 트랙백을 주세요~~;;;;;;;;;;


 


ps. MFC 7.0에는 아래와 같이 원형이 바뀌었다.
첫번째 파라미터도 LPCTSTR형으로.....


static BOOL SetCookie(
   LPCTSTR pstrUrl,
   LPCTSTR pstrCookieName,
   LPCTSTR pstrCookieData
);