Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Funkcja usługi WriteFmtUserTypeStg używana w metodzie IPaper::Save wymaga parametrów ciągu Unicode. Tak jest w przypadku wywołań usługi COM/OLE, które przyjmują parametry ciągu. Podczas kompilowania ciągów ANSI oczekiwane parametry Unicode wymagają konwersji z ANSI na Unicode. Ten proces jest osiągany przy użyciu niektórych makr w narzędziu APPUTIL.h, które mogą spowodować niejasne konwersje. Zobacz na przykład WriteFmtUserTypeStg.
Następujące wywołanie zostanie wyświetlone w metodzie Save.
WriteFmtUserTypeStg(pIStorage, m_ClipBdFmt, TEXT(CLIPBDFMT_STR));
Gdy StoServe jest kompilowany dla ANSI (nie dla Unicode), to wywołanie faktycznie zmniejsza wywołanie wewnętrznej funkcji zastępczej APPUTIL. W tym celu w pliku Apputil.h jest używany następujący schemat makr, który jest dołączonym plikiem we wszystkich przykładowych przykładach kodu. Pliki 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
Schemat używa funkcji wywołania usługi zastępczej. Wersje anSI wywołań zaczynają się od A_. Te zastępcze funkcje ANSI są implementowane w Apputil.cpp. Są one używane, gdy przykładowy kod jest kompilowany dla ciągów ANSI (wartość domyślna w plikach make). Funkcje usługi, które zastępcze stoją zamiast obsługi tylko parametrów ciągu Unicode. Wymusza to pewne konwersje ciągów z ANSI na Unicode przed wykonaniem rzeczywistego wywołania usługi COM/OLE wewnątrz zastępczego.
Jeśli na przykład kod UNICODE nie jest zdefiniowany podczas kompilowania, wszystkie wywołania w przykładach do funkcji WriteFmtUserTypeStg COM są w rzeczywistości zmieniane przez makra na wywołania funkcji A_WriteFmtUserTypeStg zaimplementowanej w narzędziu APPUTIL. CPP. Ta funkcja akceptuje wejściowy wskaźnik ciągu ANSI, konwertuje go na kopię Unicode i przekazuje tę kopię Unicode jako parametr ciągu w wywołaniu do rzeczywistej funkcji WriteFmtUserTypeStg.
Oto A_WriteFmtUserTypeStg z 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;
}