Sdílet prostřednictvím


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í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

87zae4a3.collapse_all(cs-cz,VS.110).gifKó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);
}

87zae4a3.collapse_all(cs-cz,VS.110).gifUpozorně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 .

87zae4a3.collapse_all(cs-cz,VS.110).gifRozšíř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);
}

87zae4a3.collapse_all(cs-cz,VS.110).gifPož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

Další zdroje

Makra ATL