Unicode-overwegingen

Voor de servicefunctie WriteFmtUserTypeStg, die wordt gebruikt in de methode IPaper::Save, zijn Unicode-tekenreeksparameters vereist. Dit is het geval bij COM/OLE-serviceoproepen die tekenreeksparameters gebruiken. Bij het compileren van ANSI-tekenreeksen moeten de verwachte Unicode-parameters worden geconverteerd van ANSI naar Unicode. Dit proces wordt bereikt met behulp van sommige macro's in APPUTIL.h die conversies kunnen verbergen. Zie bijvoorbeeld WriteFmtUserTypeStg.

De volgende aanroep wordt weergegeven in de methode Opslaan.

WriteFmtUserTypeStg(pIStorage, m_ClipBdFmt, TEXT(CLIPBDFMT_STR));

Wanneer StoServe- is gecompileerd voor ANSI (niet voor Unicode), vermindert deze aanroep daadwerkelijk tot een aanroep naar een interne APPUTIL-surrogaatfunctie. Ter ondersteuning hiervan wordt het volgende macroschema gebruikt in Apputil.h, een opgenomen bestand in alle codevoorbeelden. CPP-bestanden.

#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

Het schema maakt gebruik van functies voor het aanroepen van surrogaatservices. De ANSI-versies van de aanroepen beginnen met A_. Deze surrogaat ANSI-functies worden geïmplementeerd in Apputil.cpp. Ze worden gebruikt wanneer het codevoorbeeld wordt gecompileerd voor ANSI-tekenreeksen (de standaardinstelling in de makefiles). De servicefuncties die de surrogaten in plaats van alleen Unicode-tekenreeksparameters ondersteunen. Dit dwingt sommige tekenreeksconversies van ANSI naar Unicode af voordat de echte COM/OLE-serviceaanroep wordt uitgevoerd in de surrogaat.

Als UNICODE bijvoorbeeld niet is gedefinieerd tijdens het compileren, worden aanroepen in de voorbeelden naar de WriteFmtUserTypeStg COM-servicefunctie daadwerkelijk gewijzigd door de macro's in aanroepen naar een A_WriteFmtUserTypeStg functie die is geïmplementeerd in APPUTIL. CPP. Deze functie accepteert de ansi-tekenreeksaanwijzer voor invoer, converteert deze naar een Unicode-kopie en geeft deze Unicode-kopie door als de tekenreeksparameter in een aanroep naar de werkelijke WriteFmtUserTypeStg functie.

Hier is A_WriteFmtUserTypeStg van 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;
  }