Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La función de servicio WriteFmtUserTypeStg, que se usa en el método IPaper::Save, requiere parámetros de cadena Unicode. Este es el caso de las llamadas de servicio COM/OLE que toman parámetros de cadena. Al compilar para cadenas ANSI, los parámetros Unicode esperados necesitan la conversión de ANSI a Unicode. Este proceso se logra mediante algunas macros en APPUTIL.h que pueden ocultar las conversiones. Por ejemplo, vea WriteFmtUserTypeStg.
La siguiente llamada aparece en el método Save.
WriteFmtUserTypeStg(pIStorage, m_ClipBdFmt, TEXT(CLIPBDFMT_STR));
Cuando se compila StoServe para ANSI (no para Unicode), esta llamada se reduce realmente a una llamada a una función suplente APPUTIL interna. Para admitir esto, el siguiente esquema de macro se usa en Apputil.h, que es un archivo incluido en todo el ejemplo de código . Archivos 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
El esquema usa funciones de llamada de servicio suplentes. Las versiones ANSI de las llamadas comienzan por A_. Estas funciones ANSI suplentes se implementan en Apputil.cpp. Se usan cuando se compila el ejemplo de código para cadenas ANSI (el valor predeterminado en los archivos make). Las funciones de servicio que los suplentes se sitúan en lugar de admitir solo parámetros de cadena Unicode. Esto fuerza algunas conversiones de cadena de ANSI a Unicode antes de que se realice la llamada real del servicio COM/OLE dentro del suplente.
Por ejemplo, si no se define UNICODE durante la compilación, las macros cambian realmente las llamadas de los ejemplos a la función de servicio WriteFmtUserTypeStg COM en llamadas a una función de A_WriteFmtUserTypeStg que se implementa en APPUTIL. CPP. Esta función acepta el puntero de cadena ANSI de entrada, lo convierte en una copia Unicode y pasa esa copia Unicode como parámetro de cadena en una llamada a la función WriteFmtUserTypeStg.
Este es 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;
}