Compartilhar 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. Esse é o caso de chamadas de serviço COM/OLE que levam 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. Esse processo é obtido usando algumas macros no APPUTIL.h que podem obscurecer conversões. Por exemplo, consulte WriteFmtUserTypeStg.

A chamada a seguir aparece no método Salvar.

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

Quando stoServe é compilado para ANSI (não para Unicode), essa chamada realmente reduz a uma chamada para uma função substituta do APPUTIL interna. Para dar suporte a isso, o esquema de macro a seguir é usado no 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 de chamada de serviço substitutas. As versões ANSI das chamadas começam com A_. Essas funções ANSI substitutas são implementadas no 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 dar suporte apenas a 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 no APPUTIL. CPP. Essa 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 de cadeia de caracteres em uma chamada para a função WriteFmtUserTypeStg de 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;
  }