Udostępnij przez


Zagadnienia dotyczące unicode

Funkcja usługi WriteFmtUserTypeStg używana w metodzie IPaper::Save wymaga parametrów ciągu Unicode. Tak jest w przypadku wywołań usługi COM/OLE, które przyjmują parametry ciągu. Podczas kompilowania ciągów ANSI oczekiwane parametry Unicode wymagają konwersji z ANSI na Unicode. Ten proces jest osiągany przy użyciu niektórych makr w narzędziu APPUTIL.h, które mogą spowodować niejasne konwersje. Zobacz na przykład WriteFmtUserTypeStg.

Następujące wywołanie zostanie wyświetlone w metodzie Save.

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

Gdy StoServe jest kompilowany dla ANSI (nie dla Unicode), to wywołanie faktycznie zmniejsza wywołanie wewnętrznej funkcji zastępczej APPUTIL. W tym celu w pliku Apputil.h jest używany następujący schemat makr, który jest dołączonym plikiem we wszystkich przykładowych przykładach kodu. Pliki 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

Schemat używa funkcji wywołania usługi zastępczej. Wersje anSI wywołań zaczynają się od A_. Te zastępcze funkcje ANSI są implementowane w Apputil.cpp. Są one używane, gdy przykładowy kod jest kompilowany dla ciągów ANSI (wartość domyślna w plikach make). Funkcje usługi, które zastępcze stoją zamiast obsługi tylko parametrów ciągu Unicode. Wymusza to pewne konwersje ciągów z ANSI na Unicode przed wykonaniem rzeczywistego wywołania usługi COM/OLE wewnątrz zastępczego.

Jeśli na przykład kod UNICODE nie jest zdefiniowany podczas kompilowania, wszystkie wywołania w przykładach do funkcji WriteFmtUserTypeStg COM są w rzeczywistości zmieniane przez makra na wywołania funkcji A_WriteFmtUserTypeStg zaimplementowanej w narzędziu APPUTIL. CPP. Ta funkcja akceptuje wejściowy wskaźnik ciągu ANSI, konwertuje go na kopię Unicode i przekazuje tę kopię Unicode jako parametr ciągu w wywołaniu do rzeczywistej funkcji WriteFmtUserTypeStg.

Oto A_WriteFmtUserTypeStg z Apputil.cpp.

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;
  }