Compartilhar via


Considerações 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 recebem 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 Save .

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 alternativa 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 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 dão 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 real do serviço COM/OLE 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 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;
  }