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