본문 바로가기
기타정보

[기타] Visual C++6.0 마이그레이션 오류 처리

by Junk_Seo 2024. 3. 6.
반응형

1. 개요

  • 예전에 Visual C++6.0에서 만든 MFC 프로젝트를 Visual Studio 2015로 마이그레이션 작업을 진행한 적이 있습니다.
  • 해당 마이그레이션 과정에서 발생했던 오류와 이를 해결한 내용을 정리합니다.

2. 오류 및 처리 내용

2.1. error LNK2026: 모듈이 SAFESEH 이미지에 대해 안전하지 않습니다.

  • 프로젝트 - 구성 속성 - 링커 - 고급 탭으로 이동한 뒤, '이미지에 안전한 예외 처리기 포함' 항목을 아니요(/SAFESEH:NO}로 변경

2.2. winnt.h(2487,1): error C2118: 첨자가 음수입니다.

  • 프로젝트 - 구성 속성 - C/C++ - 전처리기 탭으로 이동한 뒤, 전처리기 정의에 "WINDOWS_IGNORE_PACKING_MISMATCH" 추가한다.

2.3. LINK : fatal error LNK1104: 'LIBC.lib' 파일을 열 수 없습니다.

  • 해당 오류의 원인은 Visual Studio가 이제 더이상 단일스레드를 지원하지 않아서라고 한다.
  • 해당 라이브러리를 무시하면 된다고 한다.
  • 프로젝트 -> 구성 속성 -> 링커 ->입력 탭으로 이동한 뒤, 특정 라이브러리 무시에 libc.lib을 추가한다.

2.4. error D8016 : '/ZI'과(와) '/Gy-' 명령줄 옵션이 호환되지 않습니다.

  • 프로젝트 -> 구성 속성 -> C/C++ -> 코드 생성 탭으로 이동한 뒤, 함수수준 링크사용을 예(/Gy)로 설정

2.5. error C2440: 'static_cast': 'int (__thiscall CMainFrame::* )(void)'에서 'AFX_PMSG'(으)로 변환할 수 없습니다.

  • ON_COMMAND 수정
    ON_COMMAND(IDM_FILE_CONNECT, OnFileConnect)
    이것을
    ON_COMMAND(IDM_FILE_CONNECT, (AFX_PMSG)OnFileConnect)
    (AFX_PMSG) 추가하여 수정​

2.6. error C2440: 'static_cast': 'int (__thiscall CBottomListView::* )(void)'에서 'AFX_PMSG'(으)로 변환할 수 없습니다.

  • ON_MESSAGE 수정
    ON_MESSAGE(WM_U_DOCUMENT, OnDocument) 
    이것을
    ON_MESSAGE(WM_U_DOCUMENT, (LRESULT(AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))OnDocument) 
    ((LRESULT(AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM)) 추가하여 수정

2.7. error C2440: 'static_cast': 'UINT (__thiscall CGuiMiniFrame::* )(CPoint)'에서 'LRESULT (__thiscall CWnd::* )(CPoint)'(으)로 변환할 수 없습니다.

  • 함수의 반환값 수정
    afx_msg UINT OnNcHitTest(CPoint point);
    이것을
    afx_msg LRESULT OnNcHitTest(CPoint point);
    UINT를 LRESULT 변경

2.8. error C2039: 'ReadHuge': 'CStdioFile'의 멤버가 아닙니다.

  • Visual Studio 6.0 - CStdioFile 클래스에 ReadHuge() 멤버함수가 있었지만 vs2005 이후에는 ReadHuge() 함수가 사라지고 Read() 함수로 대체되었습니다.
  • ReadHuge() 함수를 Read() 함수로 변경합니다.

2.9. error C2316 CFileException ...

  • Exception 매개변수 수정
    catch (CFileException e)
    이것을
    catch (CFileException e[])
    e에서 e[]로 변경​

 

2.10. error C2039: 'InlineIsEqualGUID': 'ATL'의 멤버가 아닙니다.

  • 함수 내용 수정
    STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
    {
    	static const IID* arr[] = 
    	{
    		&IID_IAxNCASign,
    	};
    	for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
    	{
    		if (::ATL::InlineIsEqualGUID(*arr[i], riid))
    			return S_OK;
    	}
    	return S_FALSE;
    }
    
    위 를 다음과 같이 변경
    
    STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
    {
    	static const IID* arr[] = 
    	{
    		&IID_IAxNCASign,
    	};
    	for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
    	{
    #if _ATL_VER >= 0x700
    		if (InlineIsEqualGUID(*arr[i], riid))
    			return S_OK;
    #else
    		if (::ATL::InlineIsEqualGUID(*arr[i], riid))
    			return S_OK;
    #endif
    	}
    	return S_FALSE;
    }
    		return S_FALSE;
    	}​
반응형