Sdílet prostřednictvím


ATL a MFC řetězec Převod makra

Převod makra řetězec zde popsané jsou platné pro ATL a MFC.Další informace o převodu řetězce MFC naleznete v tématu TN059: pomocí MFC MBCS/Unicode Převod makra a MFC makra a Globals.

  • Knihovna ATL 7.0 řetězec převod tříd a makra

  • Knihovna ATL 3.0 řetězec Převod makra

Knihovna ATL 7.0 řetězec převod tříd a makra

ATL – 7.0 nově obsahuje několik nových převod tříd a makra, poskytování významných vylepšení přes existující makra.

Názvy nové třídy převod řetězce a makra ve formě:

CSourceType2[C]DestinationType[EX]

kde:

  • SourceType a DestinationType jsou popsány v následující tabulce.

  • [C] je k dispozici, pokud typ cílového musí být konstantní.

  • [EX] je k dispozici, pokud musí být zadána počáteční velikost vyrovnávací paměti jako šablonu argumentu.

    SourceType/DestinationType

    Popis

    OBJEKT

    Řetězec znaků ANSI.

    W

    Řetězec znaků Unicode.

    T

    Obecný textový řetězec (ekvivalentní W Při _UNICODE definován, je ekvivalentem A jinak).

    OLE

    Řetězec znaků OLE (ekvivalentní W).

Například pokud chcete z řetězce Unicode převést na řetězec obecný beze změny převedený řetězec, použijte CW2CT.

Poznámka k upozorněníUpozornění

Některé permutací vzorku výše uvedených nejsou podporovány.CA2CW a CW2CA (a CA2CWEX a CW2CAEX) nejsou podporovány.Pro OLE znaku řetězec převody pouze COLE2T a CT2OLE (a COLE2CT, COLE2TEX, COLE2CTEX, CT2COLE, CT2OLEEX, a CT2COLEEX) jsou podporovány.Další informace naleznete v tématu atlconv.h.

Pokud se označuje, že převedený řetězec je pravděpodobně více než 64 znaků EX verze, jako je například CW2CTEX<64>, lze použít k uložení místa v zásobníku.

[!POZNÁMKA]

Doporučený způsob převodu do a z řetězce BSTR je používat CComBSTR třídy.Chcete-li převést na BSTR, předejte existujícího řetězce konstruktoru CComBSTR.Chcete-li převést z BSTR, použijte COLE2[C]DestinationType[EX], jako je například COLE2T.

Nový převod třídy, které vyžadují do vyrovnávací paměti (CA2AEX, CA2WEX, CW2AEX, a CW2WEX) pomocí statické vyrovnávací paměti pevné velikosti k ukládání výsledků převodu.Pokud je výsledek příliš velká a nevejde se do vyrovnávací paměti pro statické, třída přiděluje paměť pomocí malloc, uvolnit paměť, když objekt mimo rozsah.To zajistí, že na rozdíl od starší Textová makra převod tyto třídy jsou bezpečně používat v cykly a nebude přetečení zásobníku.

Převod makra zavedena v ATL 7.0 jsou optimalizována tak, aby je potřeba upozornit na vstupu NULL řetězce.Vrátí tyto makra NULL Pokud je vstupní parametr NULL bez přidělení paměť.

Ve výchozím nastavení Převod třídy ATL a makra použije aktuální vlákno ANSI znakové stránky pro převod.Pokud chcete přepsat toto chování pro specifický převod pomocí makra, které jsou založeny na třídách CA2WEX nebo CW2AEX, zadejte znakové stránky jako druhý parametr do konstruktoru pro třídu.

Poznámka k zabezpečeníPoznámka k zabezpečení

Zkontrolujte délku řetězce před jejich předáním tato makra, 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 mohla být zachycena také s try / s výjimkou.

Existuje několik důležitých rozdílů mezi starší makra převod řetězce a nové třídy převod řetězec:

Původní ATL 3.0 Převod makra

Nové třídy ATL 7.0 převodu

Přidělí paměť v zásobníku.

Používá skládání paměti pro malé řetězce.Použije haldy, pokud není dostatečně velká zásobníku.

Řetězec je uvolněno při funkce je byl ukončen.

Řetězec je uvolněno při proměnné mimo rozsah.

Nelze použít v obslužné rutiny výjimek.

Lze použít v obslužné rutiny výjimek.

Není vhodné pro použití ve cykly.Využití paměti zvětšuje, dokud funkce je byl ukončen.

Podporuje použití v cykly.Rozsah cyklu zajišťuje, že paměť je uvolněno při každém opakování.

Není vhodné pro velké řetězce.Prostor v zásobníku je omezena.

Žádné problémy s velké řetězce.Řetězce budou přiděleny do haldy.

Obvykle vyžadují USES_CONVERSION, aby byla definována.

Nikdy vyžadují USES_CONVERSION, aby byla definována.

Význam OLE 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é

By měl zdůraznil, že následující není funkční kódu:

LPCTSTR szr = CA2T(szReplaceFile);

Pomocí makra ATL 3.0, byla nepřijatelné využívat:

LPCTSTR szr = A2T(szReplaceFile);   

jako paměti přidělené převod by funkce uvolněna, dokud není aktuální funkce byl ukončen.Stejný kód nefunguje s nové třídy.

Tento kód:

LPCTSTR szr = CA2T(szReplaceFile);   

je ekvivalentem tohoto:

LPCTSTR szr;
{
   CA2T temp(szReplaceFile);
   szr = temp.operator LPTSTR();
}   

Jako paměti přidělené dočasný objekt a vrácená z operátoru přetypování zničení při zničení 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átor přetypování usnadňuje CA2T objekt vypadat LPCTSTR.

Pokročilé využ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, použijte verzi ze makra a zadejte velikost vyrovnávací paměti jako šablonu argumentu.

// 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 jako druhý parametr do konstruktoru pro třídu sloužící k určení znakové stránky.

// Example 5 
// Specifying the code page. 
void ExampleFunction5(LPCWSTR pszW)
{
   // Convert to the Macintosh code page
   ExampleFunctionA(CW2A(pszW, CP_MACCP));
}

Knihovna ATL 3.0 řetězec Převod makra

Původní text Převod makra jsou stále k dispozici a jsou uvedeny v následující tabulce:

Knihovna ATL 3.0 řetězec Převod makra

A2BSTR

OLE2A

T2A

W2A

A2COLE

OLE2BSTR

T2BSTR

W2BSTR

A2CT

OLE2CA

T2CA (Nepoužívané.Použít T2CA_EX nebo CT2CA místo toho.)

W2CA

A2CW

OLE2CT

T2COLE

W2COLE

A2OLE

OLE2CW

T2CW

W2CT

A2T

OLE2T

T2OLE

W2OLE

A2W

OLE2W

T2W

W2T

Pomocí těchto makra syntaxe je následující:

MACRONAME( string_address )

Příklad:

A2W(lpa);

V názvech makra je typ řetězce zdroje na levé straně (například A) a typ cílového řetězec je v pravé části (například W).A zastupuje LPSTR, OLE zastupuje LPOLESTR, T zastupuje LPTSTR, a W znamená LPWSTR.

Pokud je C v názvu makra makra převede const řetězec.Můžete například W2CA převede LPWSTR na LPCSTR.

Tedy A2W převede LPSTR k LPWSTR, OLE2T převede LPOLESTR na LPTSTR, a tak dále.

Chování ATL řetězec Převod makra závisí na direktivy kompilátoru efekt, pokud existuje.Je-li zdrojovým a cílovým typy jsou stejné, bez převodu se uskuteční.Změnit direktivami kompilátoru T a OLE takto:

Kompilátor směrnice v platnost

Změní T

Změní OLE

Žádná

A

W

_UNICODE

W

W

OLE2ANSI

A

A

_UNICODE a OLE2ANSI

W

A

Cílový řetězec je vytvořen pomocí _alloca, s výjimkou případů, kdy je typ cílového BSTR.Pomocí _alloca přiděluje paměť ze zásobníku tak, aby při návratu své funkce je automaticky vyčistit.Ve výchozím nastavení tato makra bude převést pouze maximálně 500KB najednou.

Používáte-li ATL – řetězec Převod makra, zadejte USES_CONVERSION makra na začátku své funkce tak, aby nedocházelo k chybám 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 hlaviček: AtlBase.h, AtlConv.h (deklarované v AtlConv.h)

Viz také

Referenční dokumentace

DEVMODE a TEXTMETRIC řetězec Převod makra

Další zdroje

Makra ATL