Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die WriteFmtUserTypeStg Dienstfunktion, die in der IPaper::Save-Methode verwendet wird, erfordert Unicode-Zeichenfolgenparameter. Dies ist der Fall bei COM/OLE-Dienstaufrufen, die Zeichenfolgenparameter annehmen. Beim Kompilieren für ANSI-Zeichenfolgen benötigen die erwarteten Unicode-Parameter Konvertierungen von ANSI in Unicode. Dieser Vorgang wird mithilfe einiger Makros in APPUTIL.h erreicht, die Konvertierungen verdecken können. Siehe z. B. WriteFmtUserTypeStg.
Der folgende Aufruf wird in der Save-Methode angezeigt.
WriteFmtUserTypeStg(pIStorage, m_ClipBdFmt, TEXT(CLIPBDFMT_STR));
Wenn StoServe für ANSI (nicht für Unicode) kompiliert wird, reduziert sich dieser Aufruf tatsächlich auf einen Aufruf einer internen APPUTIL-Ersatzfunktion. Um dies zu unterstützen, wird das folgende Makroschema in Apputil.h verwendet, bei dem es sich um eine enthaltene Datei in allen Codebeispielen handelt. CPP-Dateien.
#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
Das Schema verwendet Surrogate-Dienstaufruffunktionen. Die ANSI-Versionen der Aufrufe beginnen mit A_. Diese Ersatz-ANSI-Funktionen werden in Apputil.cpp implementiert. Sie werden verwendet, wenn das Codebeispiel für ANSI-Zeichenfolgen kompiliert wird (die Standardeinstellung in den Makefiles). Die Dienstfunktionen, die die Surrogates anstelle der Unterstützung nur Unicode-Zeichenfolgenparameter unterstützen. Dadurch werden einige Zeichenfolgenkonvertierungen von ANSI in Unicode erzwungen, bevor der tatsächliche COM/OLE-Dienstaufruf innerhalb des Ersatzdiensts erfolgt.
Wenn UNICODE beispielsweise während der Kompilierung nicht definiert ist, werden alle Aufrufe in den Beispielen an die WriteFmtUserTypeStg COM-Dienstfunktion tatsächlich von den Makros in Aufrufe einer in APPUTIL implementierten A_WriteFmtUserTypeStg-Funktion geändert. CPP. Diese Funktion akzeptiert den EINGABE-ANSI-Zeichenfolgenzeiger, konvertiert ihn in eine Unicode-Kopie und übergibt diese Unicode-Kopie als Zeichenfolgenparameter in einem Aufruf an den tatsächlichen WriteFmtUserTypeStg Funktion.
Hier ist A_WriteFmtUserTypeStg von 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;
}