次の方法で共有


Unicode に関する考慮事項

IPaper::Save メソッドで使用される WriteFmtUserTypeStg サービス関数には、Unicode 文字列パラメーターが必要です。 これは、文字列パラメーターを受け取る COM/OLE サービス呼び出しの場合です。 ANSI 文字列をコンパイルする場合、予期される Unicode パラメーターには ANSI から Unicode への変換が必要です。 このプロセスは、変換を隠す可能性がある APPUTIL.h の一部のマクロを使用して実現されます。 たとえば、「 WriteFmtUserTypeStg」を参照してください

Save メソッドに次の呼び出しが表示されます。

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

StoServe が ANSI 用 (Unicode の場合はコンパイルされない) の場合、この呼び出しは実際には内部 APPUTIL サロゲート関数の呼び出しに減ります。 これをサポートするために、Apputil.h では次のマクロ スキームが使用されます。これは、すべてのコード サンプル に含まれるファイルです。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

このスキームでは、サロゲート サービス呼び出し関数を使用します。 ANSI バージョンの呼び出しは、A_で始まります。 これらのサロゲート ANSI 関数は、Apputil.cpp に実装されています。 これらは、コード サンプルが ANSI 文字列 (メイクファイルの既定値) 用にコンパイルされるときに使用されます。 サロゲートが Unicode 文字列パラメーターのみをサポートする代わりに機能するサービス関数。 これにより、実際の COM/OLE サービス呼び出しがサロゲート内で行われる前に、ANSI から Unicode への一部の文字列変換が強制されます。

たとえば、コンパイル中に UNICODE が定義されていない場合、 WriteFmtUserTypeStg COM サービス関数に対するサンプル内のすべての呼び出しは、マクロによって実際に APPUTIL に実装されているA_WriteFmtUserTypeStg関数の呼び出しに変更されます。Cpp。 この関数は、入力 ANSI 文字列ポインターを受け取り、Unicode コピーに変換し、その Unicode コピーを実際の WriteFmtUserTypeStg 関数の呼び出しで文字列パラメーターとして渡します。

Apputil.cpp からのA_WriteFmtUserTypeStgを次に示します。

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