다음을 통해 공유


유니코드 고려 사항

IPaper::Save 메서드에 사용되는 WriteFmtUserTypeStg 서비스 함수에는 유니코드 문자열 매개 변수가 필요합니다. 문자열 매개 변수를 사용하는 COM/OLE 서비스 호출의 경우입니다. ANSI 문자열을 컴파일할 때 예상되는 유니코드 매개 변수는 ANSI에서 유니코드로 변환해야 합니다. 이 프로세스는 변환을 모호하게 할 수 있는 APPUTIL.h의 일부 매크로를 사용하여 수행됩니다. 예를 들어 WriteFmtUserTypeStg를 참조하세요.

Save 메서드에 다음 호출이 나타납니다.

WriteFmtUserTypeStg(pIStorage, m_ClipBdFmt, TEXT(CLIPBDFMT_STR));

AnSI(유니코드용이 아님)에 대해 StoServe 가 컴파일되면 이 호출은 실제로 내부 APPUTIL 서로게이트 함수에 대한 호출로 줄어듭니다. 이를 지원하기 위해 Apputil.h에서 다음 매크로 체계가 사용됩니다. 이 매크로 체계는 모든 코드 샘플 에 포함된 파일입니다. CPP 파일.

#if !defined(UNICODE)

  STDAPI A_WriteFmtUserTypeStg(IStorage*, CLIPFORMAT, LPSTR);

  #if !defined(_NOANSIMACROS_)

  #undef WriteFmtUserTypeStg
  #define WriteFmtUserTypeStg(a, b, c) A_WriteFmtUserTypeStg(a, b, c)

  #endif

  #endif

스키마는 서로게이트 서비스 호출 함수를 사용합니다. ANSI 버전의 호출은 A_ 시작합니다. 이러한 서로게이트 ANSI 함수는 Apputil.cpp에서 구현됩니다. ANSI 문자열(메이크파일의 기본값)에 대해 코드 샘플을 컴파일할 때 사용됩니다. 서로게이트가 유니코드 문자열 매개 변수만 지원하는 대신 대기하는 서비스 함수입니다. 이렇게 하면 실제 COM/OLE 서비스 호출이 서로게이트 내에서 수행되기 전에 ANSI에서 유니코드로 일부 문자열 변환이 강제로 수행됩니다.

예를 들어 컴파일 중에 UNICODE가 정의되지 않은 경우 WriteFmtUserTypeStg COM 서비스 함수에 대한 샘플의 모든 호출은 매크로가 APPUTIL에서 구현된 A_WriteFmtUserTypeStg 함수에 대한 호출로 실제로 변경됩니다. Cpp. 이 함수는 입력 ANSI 문자열 포인터를 수락하고 유니코드 복사본으로 변환한 다음 실제 WriteFmtUserTypeStg 함수에 대한 호출에서 해당 유니코드 복사를 문자열 매개 변수로 전달합니다.

다음은 Apputil.cpp의 A_WriteFmtUserTypeStg.

STDAPI A_WriteFmtUserTypeStg(
           IStorage* pIStorage,
           CLIPFORMAT ClipFmt,
           LPSTR pszUserType)
  {
    HRESULT hr = E_INVALIDARG;
    WCHAR wszUc[MAX_PATH];

    if (NULL != pszUserType)
    {
      // Convert from ANSI in pszUserType to Unicode in wszUc.
      AnsiToUc(pszUserType, wszUc, MAX_PATH);

      // Use the Unicode string in the actual service call.
      hr = WriteFmtUserTypeStg(pIStorage, ClipFmt, wszUc);
    }

    return hr;
  }