ATL a MFC řetězec Převod makra
Převod makra řetězec zmíněny v tomto článku jsou platné pro ATL a MFC.Další informace o převodu řetězce MFC, viz TN059: pomocí makra převod znakové sady MBCS/Unicode MFC a MFC makra a Globals.
ATL 7.0 řetězec převodu třídy a makra
ATL 3.0 řetězec Převod makra
ATL 7.0 řetězec převodu třídy a makra
ATL 7.0 zavádí několik nových tříd převodu a makra, poskytují významná vylepšení přes existující makra.
Názvy nových tříd převodu řetězce a makra formu:
CSourceType2CDestinationTypeEX
kde:
SourceType a DestinationType jsou popsány v následující tabulce.
c se nachází při určení typu musí být konstantní.
EX se nachází při počáteční velikost vyrovnávací paměti musí být zadán jako argument šablony.
SourceType/DestinationType
Description
A
Řetězec znaků ANSI.
W
Řetězec znaků Unicode.
T
Obecný znakový řetězec (ekvivalent w při _UNICODE je definováno, rovnocenné jinak).
OLE
Řetězec znaků OLE (ekvivalent W).
Například převést z řetězce Unicode obecný řetězec bez změny převedeného řetězec, pomocí CW2CT.
Pokud je známo, že je pravděpodobně více než 64 znaků převedeného řetězec EX verzi, jako například CW2CTEX <64>, lze ušetřit místo v zásobníku.
[!POZNÁMKA]
Doporučený způsob převodu z řetězce BSTR a je použít CComBSTR třídy.Převést na BSTR, předat existující řetězec konstruktoru CComBSTR. Pokud chcete převést z BSTR, použijte COLE2cDestinationTypeEX, jako například COLE2T.
Nové třídy převodu, které vyžadují vyrovnávací paměti (CA2AEX, CA2WEX , CW2AEX , a CW2WEX ) k ukládání výsledků převodu použít statické vyrovnávací paměti pevné velikosti.Jestliže je výsledek příliš velké a nevejde se do vyrovnávací paměti statické třídy přiděluje paměti pomocí malloc , uvolnění paměti, když objekt je mimo rozsah.Tím zajistíte, že na rozdíl od starších textová Převod makra tyto třídy jsou bezpečně používat ve smyčkách a nebude přetečení zásobníku.
Převod makra v ATL 7.0 jsou optimalizovány znát vstupní NULL řetězce.Tato makra vrátí NULL Pokud je vstupní parametr NULL bez přidělení paměť.
Ve výchozím nastavení převodu třídy ATL a makra použije znaková stránka ANSI aktuální podproces pro převod.Pokud chcete potlačit toto chování pro specifický převod pomocí maker založené na třídách CA2WEX nebo CW2AEX , určit znakovou stránku jako druhý parametr konstruktoru třídy.
Poznámka k zabezpečení |
---|
Zkontrolujte délku řetězce před jejich předáním těchto maker, aby nedocházelo k problémům přetečení vyrovnávací paměti.Přetečení zásobníku jsou výjimky, které by mohl také ulovených zkuste / kromě. |
Existuje několik důležité rozdíly mezi starší makra převodu řetězce a nové třídy převodu řetězce:
Staré ATL 3.0 Převod makra |
Nové ATL 7.0 převod třídy |
---|---|
Přidělí paměť v zásobníku. |
Použití zásobníku paměti pro malé řetězce.Pokud není dostatečně velký zásobník používá haldu. |
Pokud funkce skončí řetězec uvolněno. |
Řetězec je uvolněna při proměnné je mimo rozsah. |
Nelze použít v popisovačích výjimek. |
Lze použít v popisovačích výjimek. |
Není vhodný pro použití v smyčky.Využití paměti roste, dokud je funkce. |
Podporuje pomocí smyčky.Smyčka oboru zajišťuje paměť je uvolněna při každém opakování. |
Není vhodné pro velké řetězce.Místa v zásobníku je omezené. |
Žádné problémy s velkými řetězci.Řetězce budou přiděleny na haldy. |
Obvykle vyžadují USES_CONVERSION definovat. |
Nikdy vyžadovat USES_CONVERSION definovat. |
OLE význam závisí na definici OLE2ANSI. |
OLE je vždy ekvivalentní W. |
Příklad
Kód
//Example 1
// Convert LPCWSTR to LPCSTR.
void ExampleFunction1(LPCWSTR pszW)
{
// Create an instance of CW2A, called pszA,
// and initialize it with pszW.
CW2A pszA(pszW);
// pszA works like an LPCSTR, and can be used thus:
ExampleFunctionA(pszA);
// Note: pszA will become invalid when it goes out of scope.
}
// Example 2
// Use a temporary instance of CW2A.
void ExampleFunction2(LPCWSTR pszW)
{
// Create a temporary instance of CW2A,
// and initialize it with pszW.
ExampleFunctionA(CW2A(pszW));
// Note: the temporary instance becomes invalid
// after the execution of the statement above.
}
// Example 3
// Incorrect use of conversion macros.
void ExampleFunction3(LPCWSTR pszW)
{
// Create a temporary instance of CW2A,
// save a pointer to it and then delete
// the temportary instance.
LPCSTR pszA = CW2A(pszW);
// The pszA in the following line is an invalid pointer,
// as the instance of CW2A has gone out of scope.
ExampleFunctionA(pszA);
}
Upozornění týkající se instance třídy dočasné
Je třeba zdůraznit, že následující není dobrý kód:
LPCTSTR szr = CA2T(szReplaceFile);
Použití maker ATL 3.0, bylo přijatelné použít:
LPCTSTR szr = A2T(szReplaceFile);
jako paměti přidělené funkce převodu nebude uvolněna, dokud byla aktuální funkce.Stejný kód nefunguje s nové třídy.
Tento kód:
LPCTSTR szr = CA2T(szReplaceFile);
odpovídá to:
LPCTSTR szr;
{
CA2T temp(szReplaceFile);
szr = temp.operator LPTSTR();
}
Jako paměti přidělené dočasný objekt a vrátil operátoru přetypování zničení při dočasný objekt, pomocí hodnoty v szr bude mít nežádoucí výsledky.
Místo toho použijte tento kód:
CA2T szr(szReplaceFile);
Operátoru přetypování vytvoří objekt CA2T vypadat LPCTSTR .
Rozšířené použití
Výchozí velikost statické vyrovnávací paměti je 128 znaků.Pokud velikost vyrovnávací paměti musí být změněna pro specifický převod, EX verzi makra a určete velikost vyrovnávací paměti jako argument šablony.
// Example 4
// Changing the size of the buffer.
void ExampleFunction4(LPCWSTR pszW)
{
// Use a 16-character buffer.
ExampleFunctionA(CW2AEX<16>(pszW));
}
Zde je příklad zadání kódu stránky jako druhý parametr konstruktoru třídy.
// Example 5
// Specifying the code page.
void ExampleFunction5(LPCWSTR pszW)
{
// Convert to the Macintosh code page
ExampleFunctionA(CW2A(pszW, CP_MACCP));
}
ATL 3.0 řetězec Převod makra
Původní text makra převodu jsou stále k dispozici a jsou uvedeny v následující tabulce:
ATL 3.0 řetězec Převod makra
A2BSTR |
OLE2A |
T2A |
W2A |
A2COLE |
OLE2BSTR |
T2BSTR |
W2BSTR |
A2CT |
OLE2CA |
T2CA (neschváleno.Use T2CA_EX or CT2CA instead.) |
W2CA |
A2CW |
OLE2CT |
T2COLE |
W2COLE |
A2OLE |
OLE2CW |
T2CW |
W2CT |
A2T |
OLE2T |
T2OLE |
W2OLE |
A2W |
OLE2W |
T2W |
W2T |
Tato makra pomocí syntaxe je následující:
MACRONAME( string_address )
Příklad:
A2W(lpa);
Názvy maker je druh zdrojový řetězec vlevo (například a) a typ řetězec cíl je na pravé straně (například w).A stands for LPSTR, OLE stands for LPOLESTR, T stands for LPTSTR, and W stands for LPWSTR.
Pokud je c v názvu makra makro převede const řetězec.Například W2CA převede LPWSTR se LPCSTR .
Tedy A2W převede LPSTR k LPWSTR , OLE2T převede LPOLESTR k LPTSTR atd.
Chování ATL řetězec Převod makra závisí na kompilátoru směrnice v platnost, pokud.Pokud zdrojový a cílový typy jsou stejné, bez převodu dojde.Změna direktivami kompilátoru t a OLE takto:
Kompilátor směrnice v platnost |
Stane se t |
Stane se OLE |
---|---|---|
Žádná |
A |
W |
_UNICODE |
W |
W |
OLE2ANSI |
A |
A |
_UNICODE a OLE2ANSI |
W |
A |
Určení řetězec je vytvořena pomocí _alloca, s výjimkou případů, kdy je typ cílového BSTR .Pomocí _alloca přiděluje paměť zásobníku, takže když funkce vrátí, je automaticky vyčištěn.Ve výchozím nastavení toto makro pouze převede 500 KB najednou.
Při použití makru ATL řetězec převodu, zadat USES_CONVERSION makro na začátku funkce, aby se zabránilo chyby kompilátoru.Příklad:
void StringFunc(LPSTR lpsz)
{
USES_CONVERSION;
LPWSTR x = A2W(lpsz);
// Do something with x
wprintf_s(L"x is %s", x);
}
Požadavky
Soubor záhlaví: AtlBase.h, AtlConv.h (deklarované v AtlConv.h)
Viz také
Referenční dokumentace
DEVMODE a TEXTMETRIC řetězec Převod makra