Partilhar via


Considerações sobre Unicode

A função de serviço WriteFmtUserTypeStg, usada no método IPaper::Save, requer parâmetros de cadeia de caracteres Unicode. Este é o caso das chamadas de serviço COM/OLE que usam parâmetros de cadeia de caracteres. Ao compilar para cadeias de caracteres ANSI, os parâmetros Unicode esperados precisam de conversão de ANSI para Unicode. Este processo é conseguido usando algumas macros em APPUTIL.h que podem obscurecer as conversões. Por exemplo, consulte WriteFmtUserTypeStg.

A chamada a seguir aparece no método Save.

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

Quando StoServe é compilado para ANSI (não para Unicode), essa chamada na verdade se reduz a uma chamada para uma função substituta APPUTIL interna. Para suportar isso, o seguinte esquema de macro é usado em Apputil.h, que é um arquivo incluído em todos os exemplos de código . Arquivos 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

O esquema usa funções substitutas de chamada de serviço. As versões ANSI das chamadas começam com A_. Estas funções ANSI substitutas são implementadas em Apputil.cpp. Eles são usados quando o exemplo de código está sendo compilado para cadeias de caracteres ANSI (o padrão nos makefiles). As funções de serviço que os substitutos ficam no lugar de suportar apenas parâmetros de cadeia de caracteres Unicode. Isso força algumas conversões de cadeia de caracteres de ANSI para Unicode antes que a chamada de serviço COM/OLE real seja feita dentro do substituto.

Por exemplo, se UNICODE não for definido durante a compilação, todas as chamadas nos exemplos para a função de serviço WriteFmtUserTypeStg COM serão realmente alteradas pelas macros em chamadas para uma função A_WriteFmtUserTypeStg implementada em APPUTIL. CPP. Esta função aceita o ponteiro de cadeia de caracteres ANSI de entrada, converte-o em uma cópia Unicode e passa essa cópia Unicode como o parâmetro string em uma chamada para a função WriteFmtUserTypeStg real.

Aqui está A_WriteFmtUserTypeStg de 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;
  }