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