TN057: MFC 구성 요소 지역화

참고 항목

다음 기술 노트는 온라인 설명서에 먼저 포함되어 있었으므로 업데이트되지 않았습니다. 따라서 일부 절차 및 항목은 만료되거나 올바르지 않을 수 있습니다. 최신 정보를 보려면 온라인 설명서 색인에서 관심 있는 항목을 검색하는 것이 좋습니다.

이 참고에서는 MFC를 사용하는 애플리케이션 또는 OLE 컨트롤 또는 DLL인 경우 구성 요소를 지역화하는 데 사용할 수 있는 몇 가지 디자인 및 절차를 설명합니다.

개요

MFC를 사용하는 구성 요소를 지역화할 때 해결해야 할 두 가지 문제가 있습니다. 먼저 사용자 고유의 리소스(문자열, 대화 상자 및 구성 요소와 관련된 기타 리소스)를 지역화해야 합니다. MFC를 사용하여 빌드된 대부분의 구성 요소에는 MFC에서 정의한 여러 리소스도 포함 및 사용합니다. 지역화된 MFC 리소스도 제공해야 합니다. 다행히 여러 언어는 이미 MFC 자체에서 제공됩니다.

또한 구성 요소는 대상 환경(유럽 또는 DBCS 사용 환경)에서 실행되도록 준비해야 합니다. 대부분의 경우 이는 애플리케이션에서 상위 비트 집합이 올바르게 설정된 문자를 처리하고 더블 바이트 문자가 있는 문자열을 처리하는 데 따라 달라집니다. MFC는 기본적으로 이러한 두 환경 모두에 대해 사용하도록 설정되므로 설치 시 서로 다른 리소스만 연결된 모든 플랫폼에서 사용되는 단일 전 세계 이진 파일을 사용할 수 있습니다.

구성 요소의 리소스 지역화

애플리케이션 또는 DLL 지역화를 위해서는 리소스를 대상 언어와 일치하는 리소스로 바꾸기만 하면 됩니다. 사용자 고유의 리소스의 경우 리소스 편집기에서 리소스를 편집하고 애플리케이션을 빌드하는 것이 비교적 간단합니다. 코드가 제대로 작성된 경우 하드 코딩된 C++ 소스 코드로 지역화하려는 문자열이나 텍스트가 없으므로 리소스를 수정하기만 하면 모든 지역화를 수행할 수 있습니다. 실제로 지역화된 버전을 제공하는 모든 항목이 원래 코드의 빌드를 포함하지 않도록 구성 요소를 구현할 수 있습니다. 이것은 더 복잡하지만 가치가 있으며 MFC 자체에 대해 선택된 메커니즘입니다. EXE 또는 DLL 파일을 리소스 편집기에 로드하고 리소스를 직접 편집하여 애플리케이션을 지역화할 수도 있습니다. 가능하지만 새 버전의 애플리케이션을 빌드할 때마다 변경 내용을 다시 적용해야 합니다.

이를 방지하는 한 가지 방법은 위성 DLL이라고도 하는 별도의 DLL에서 모든 리소스를 찾는 것입니다. 그런 다음 이 DLL은 런타임에 동적으로 로드되고 모든 코드가 포함된 기본 모듈 대신 해당 DLL에서 리소스가 로드됩니다. MFC는 이 방법을 직접 지원합니다. MYAPP.EXE라는 애플리케이션을 고려합니다. MYRES.DLL이라는 DLL에 있는 모든 리소스를 가질 수 있습니다. 애플리케이션 InitInstance 에서는 다음을 수행하여 해당 DLL을 로드하고 MFC가 해당 위치에서 리소스를 로드하도록 합니다.

CMyApp::InitInstance()
{
    // one of the first things in the init code
    HINSTANCE hInst = LoadLibrary("myres.dll");

    if (hInst != NULL)
        AfxSetResourceHandle(hInst);

    // other initialization code would follow
    // ...
}

그 때부터 MFC는 myapp.exe 대신 해당 DLL에서 리소스를 로드합니다. 그러나 모든 리소스는 해당 DLL에 있어야 합니다. MFC는 지정된 리소스를 검색하여 애플리케이션의 인스턴스를 검색하지 않습니다. 이 기술은 OLE 컨트롤뿐만 아니라 일반 MFC DLL에도 동일하게 적용됩니다. 설치 프로그램은 사용자가 어떤 리소스 로캘을 원하느냐에 따라 적절한 버전의 MYRES.DLL을 복사합니다.

리소스만 DLL만 만드는 것은 비교적 쉽습니다. DLL 프로젝트를 만들고 . RC 파일을 여기에 추가하고 필요한 리소스를 추가합니다. 이 기술을 사용하지 않는 기존 프로젝트가 있는 경우 해당 프로젝트에서 리소스를 복사할 수 있습니다. 프로젝트에 리소스 파일을 추가한 후에는 프로젝트를 빌드할 준비가 거의 완료되었습니다. /NOENTRY를 포함하도록 링커 옵션을 설정하기만 하면 됩니다. 그러면 DLL에 진입점이 없음을 링커에 알릴 수 있습니다. 코드가 없으므로 진입점이 없습니다.

참고 항목

Visual C++ 4.0 이상의 리소스 편집기에서 . RC 파일. 이렇게 하면 단일 프로젝트에서 지역화를 매우 쉽게 관리할 수 있습니다. 각 언어의 리소스는 리소스 편집기에서 생성된 전처리기 지시문에 의해 제어됩니다.

제공된 MFC 지역화된 리소스 사용

빌드하는 모든 MFC 애플리케이션은 MFC에서 코드와 리소스의 두 가지를 다시 사용합니다. 즉, MFC에는 MFC 클래스에서 사용되는 다양한 오류 메시지, 기본 제공 대화 상자 및 기타 리소스가 있습니다. 애플리케이션을 완전히 지역화하려면 애플리케이션의 리소스뿐만 아니라 MFC에서 직접 제공되는 리소스도 지역화해야 합니다. MFC는 여러 다른 언어 리소스 파일을 자동으로 제공하므로 대상으로 지정하는 언어가 MFC가 이미 지원하는 언어 중 하나인 경우 지역화된 리소스를 사용해야 합니다.

이 글을 쓰는 시점에서 MFC는 중국어, 독일어, 스페인어, 프랑스어, 이탈리아어, 일본어 및 한국어를 지원합니다. 이러한 지역화된 버전을 포함하는 파일은 MFC\INCLUDE\L.*('L'은 지역화된 디렉터리를 의미함)에 있습니다. 예를 들어 독일어 파일은 MFC\INCLUDE\L.DEU에 있습니다. 애플리케이션이 MFC\INCLUDE에 있는 파일 대신 이러한 RC 파일을 사용하도록 하려면 RC 명령줄에 추가 /IC:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\MFC\INCLUDE\L.DEU 합니다(이는 단지 예제일 뿐입니다. 선택한 로캘과 Visual C++를 설치한 디렉터리를 대체해야 합니다).

위의 지침은 애플리케이션이 MFC와 정적으로 연결되는 경우 작동합니다. 대부분의 애플리케이션은 동적으로 연결됩니다(AppWizard 기본값이기 때문). 이 시나리오에서는 코드뿐만 아니라 리소스도 동적으로 연결됩니다. 결과적으로 애플리케이션에서 리소스를 지역화할 수 있지만 MFC 구현 리소스는 MFC7x.DLL(또는 이후 버전) 또는 MFC7xLOC.DLL(있는 경우)에서 로드됩니다. 두 가지 다른 각도에서 이 방법에 접근할 수 있습니다.

더 복잡한 방법은 지역화된 MFC7xLOC.DLL(예: MFC7xDEU, 독일어, 스페인어용 MFC7xESP.DLL 등) 중 하나를 제공하거나 이후 버전을 제공하고 사용자가 애플리케이션을 설치할 때 적절한 MFC7xLOC.DLL을 시스템 디렉터리에 설치하는 것입니다. 이는 개발자와 최종 사용자 모두에게 매우 복잡할 수 있으므로 권장되지 않습니다. 이 기술과 주의 사항에 대한 자세한 내용은 기술 참고 56을 참조하세요.

가장 간단하고 안전한 방법은 애플리케이션 또는 DLL 자체(또는 사용하는 경우 해당 위성 DLL)에 지역화된 MFC 리소스를 포함하는 것입니다. 이렇게 하면 MFC7xLOC.DLL을 제대로 설치하는 문제를 방지할 수 있습니다. 이렇게 하려면 AppWizard에서 추가한 정의도 제거 /D_AFXDLL 해야 한다는 점을 제외하고 위에 지정된 정적 사례에 대해 동일한 지침을 따릅니다(지역화된 리소스를 가리키도록 RC 명령줄을 올바르게 설정). /D_AFXDLL 정의되면 AFXRES입니다. H(및 다른 MFC RC 파일)는 실제로 리소스를 정의하지 않습니다(대신 MFC DLL에서 끌어오기 때문).

참고 항목

번호별 기술 참고 사항
범주별 기술 참고 사항