Freigeben über


Unicode-Überlegungen

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