Momentálne ste offline a čaká sa, kým sa znova pripojíte na internet

Váš prehliadač nie je podporovaný

Ak chcete lokalitu používať, aktualizujte svoj prehliadač.

Aktualizovať na najnovšiu verziu Internet Explorera

Ako previesť z ANSI & Unicode Unicode do formátu ANSI pre OLE

DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.

Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:138813
SUHRN
Všetky reťazce, ktoré sú postúpené a dostala od 32-bitové OLE API arozhranie metódy používať kódovanie Unicode. To si vyžaduje aplikácie, ktoré používajú ANSIreťazce skonvertovať na Unicode pred absolvovanie im do OLE a sKonverzia Unicode reťazce, ktoré sú obdržané od OLE ANSI. Totočlánok ukazuje, ako možno tieto prevody urobiť.
DALSIE INFORMACIE
Windows NT implementuje Unicode (alebo širokých znakov) a ANSI verzieWin32 funkcie, ktoré využívajú parametrov reťazca. Avšak systém Windows 95 nepodporujeimplementovať Unicode verzia väčšine Win32 funkcie, ktoré využívajú reťazecparametre. Namiesto toho implementuje iba ANSI verzie týchtofunkcie.

Hlavné výnimkou tohto pravidla je 32-bitové OLE. 32-bitový OLE API arozhranie metódy na Windows NT a Windows 95 používajú výlučne Unicode.ANSI verzie tieto funkcie nie sú implementované buď na WindowsNT alebo Windows 95.

To znamená, že 32-bitové aplikácie, ktoré potrebuje na spustenie na obe okná95 a Windows NT musí používať ANSI verzie z non - OLE Win32funkcie a musí previesť ANSI struny do Unicode skôr, ako súodovzdaný OLE.

32-Bitová aplikácia Unicode, ktorý beží iba na Windows NT potrebujú používaťfunkcie pre konverziu akéhokoľvek ANSI/Unicode.

Win32 poskytuje MultiByteToWideChar a WideCharToMultiByte na konverziuANSI reťazce na znaky Unicode a reťazcov Unicode do formátu ANSI. Tento článokposkytuje AnsiToUnicode a UnicodeToAnsi, ktorý používa tieto funkcieANSI/Unicode konverzie.
/* * AnsiToUnicode converts the ANSI string pszA to a Unicode string * and returns the Unicode string through ppszW. Space for the * the converted string is allocated by AnsiToUnicode. */ HRESULT __fastcall AnsiToUnicode(LPCSTR pszA, LPOLESTR* ppszW){    ULONG cCharacters;    DWORD dwError;    // If input is null then just return the same.    if (NULL == pszA)    {        *ppszW = NULL;        return NOERROR;    }    // Determine number of wide characters to be allocated for the    // Unicode string.    cCharacters =  strlen(pszA)+1;    // Use of the OLE allocator is required if the resultant Unicode    // string will be passed to another COM component and if that    // component will free it. Otherwise you can use your own allocator.    *ppszW = (LPOLESTR) CoTaskMemAlloc(cCharacters*2);    if (NULL == *ppszW)        return E_OUTOFMEMORY;    // Covert to Unicode.    if (0 == MultiByteToWideChar(CP_ACP, 0, pszA, cCharacters,                  *ppszW, cCharacters))    {        dwError = GetLastError();        CoTaskMemFree(*ppszW);        *ppszW = NULL;        return HRESULT_FROM_WIN32(dwError);    }    return NOERROR;/* * UnicodeToAnsi converts the Unicode string pszW to an ANSI string * and returns the ANSI string through ppszA. Space for the * the converted string is allocated by UnicodeToAnsi. */ HRESULT __fastcall UnicodeToAnsi(LPCOLESTR pszW, LPSTR* ppszA){    ULONG cbAnsi, cCharacters;    DWORD dwError;    // If input is null then just return the same.    if (pszW == NULL)    {        *ppszA = NULL;        return NOERROR;    }    cCharacters = wcslen(pszW)+1;    // Determine number of bytes to be allocated for ANSI string. An    // ANSI string can have at most 2 bytes per character (for Double    // Byte Character Strings.)    cbAnsi = cCharacters*2;    // Use of the OLE allocator is not required because the resultant    // ANSI  string will never be passed to another COM component. You    // can use your own allocator.    *ppszA = (LPSTR) CoTaskMemAlloc(cbAnsi);    if (NULL == *ppszA)        return E_OUTOFMEMORY;    // Convert to ANSI.    if (0 == WideCharToMultiByte(CP_ACP, 0, pszW, cCharacters, *ppszA,                  cbAnsi, NULL, NULL))    {        dwError = GetLastError();        CoTaskMemFree(*ppszA);        *ppszA = NULL;        return HRESULT_FROM_WIN32(dwError);    }    return NOERROR;}				
Vzorky používanie týchto funkcií je. CoTaskMemFree sa používa naVoľný konvertované reťazec, ak CoTaskMemAlloc bolo použité na prideleniereťazec. Konvertovaný reťazec musí byť uvoľnený nie vrátené prostredníctvoman out-parameter iného komponentu OLE, pretože tento komponent jezodpovedný za uvoľnenie reťazec. LPOLESTR je smerník na Unicodereťazec.
// The following code gets an ANSI filename that is specified by the// user in the OpenFile common dialog. This file name is converted into// a Unicode string and is passed to the OLE API CreateFileMoniker. The// Unicode string is then freed.OPENFILENAME ofn;LPOLESTR pszFileNameW;LPMONIKER pmk;:// Get file name from OpenFile Common Dialog. The ANSI file name will// be placed in ofn.lpstrFileGetOpenFileName(&ofn);:AnsiToUnicode(ofn.lpstrFile, &pszFileNameW);CreateFileMoniker(pszFileNameW, &pmk);CoTaskMemFree(pszFileNameW);// The following code implements IOleInPlaceFrame::SetStatusText.// The lpszStatusText string, that is received from another OLE// component, uses Unicode. The string is converted to ANSI before it is// passed to the ANSI version of SetWindowText. Windows 95 supports only// the ANSI version of SetWindowText.COleInPlaceFrame::SetStatusText(LPCOLESTR pszStatusTextW){    LPSTR pszStatusTextA;    UnicodeToAnsi(pszStatusTextW, &pszStatusTextA);    SetWindowText(m_hwndStatus, pszStatusTextA);    CoTaskMemFree(pszStatusTextA);}				
POZNÁMKA: Poznámky v AnsiToUnicode a UnicodeToAnsi týkajúce saprideľovacieho koeficientu, ktorý sa používa na pridelenie konvertované reťazec. CoTaskMemAlloc(OLE prideľovača) je potrebné používať, len ak výsledný reťazecbudú prenesené na inom OLE komponentu, a ak môžete uvoľniť tento komponentreťazec. To znamená, že struny, ktoré prechádzajú ako v-parametreOLE rozhranie metódami potrebujú nesmie používať OLE prideľovača. Reťazce, ktoré súako v-out-parametre alebo vrátené prostredníctvom out-parametre alebo v-out-parametre musia prideliť pomocou OLE prideľovača.

Reťazcové konštanty možno previesť do Unicode pri kompilácii pomocouOLESTR makro. Napríklad:
CreateFileMoniker(OLESTR("c:\\boo\\har.doc"), &pmk);				
Ďalším príkladom ANSI/Unicode konverzie rutiny možno nájsť vMicrosoft nadácie tried (MFC) zdrojový kód, ktorý sa dodáva sVizuálne 4.0 c ++ kompilátor. Tieto rutiny sú opísané v MFC Technote59: Používanie MFC. MBCS/Unicode konverzie makrá. Definícia týchtomakrá OLE2T, T2OLE, OLE2CT, T2COLE, A2W, W2A, A2CW, W2CA aUSES_CONVERSION sú \msdev\mfc\include\afxpriv.h. Pozri ajAfxA2WHelper a AfxW2AHelper v MFC zdrojového kódu v \msdev\mfc\srca používanie OLE2T, T2OLE, OLE2CT a T2COLE v MFC zdrojového kódu v\msdev\mfc\src. Tieto funkcie umožňujú kód byť zostavené buď preUnicode alebo ANSI závislosti od toho, či Preprocesor _UNICODEdosiahol sa definícia. Napríklad, CreateFileMoniker hovornad príkladom možné vykonať takto s MFC makrá:
USES_CONVERSION;GetOpenFileName(&ofn);CreateFileMoniker(T2OLE(ofn.lpstrFile), &pmk);				
Ak je definovaná _UNICODE, T2OLE je definovaný takto:
inline LPOLESTR T2OLE(LPTSTR lp) { return lp; }				
Ak nie je definovaná _UNICODE, T2OLE je definovaný takto:
#define T2OLE(lpa) A2W(lpa)				
T v T2OLE naznačuje, že typ sa prepočíta na reťazec OLE(Unicode na reťazec) je reťazec Unicode, keď je definovaná _UNICODE aReťazec ANSI keď _UNICODE nie je definovaná. Podobne je definovaná LPTSTRSmerník na reťazec Unicode, ak je definovaná _UNICODE a ako ukazovateľna reťazec ANSI keď _UNICODE nie je definovaná. T2OLE nemá vykonajtekonverzia Ak je definovaná _UNICODE (LPTSTR == LPOLESTR). Keď Unicodeje nedefinovali, sa nazýva A2W. A2W konvertuje reťazec ANSI na Unicode akotakto:
#define A2W(lpa) (\         ((LPCSTR)lpa == NULL) ? NULL : (\             _convert = (strlen(lpa)+1),\             AfxA2WHelper((LPWSTR) alloca(_convert*2), lpa, _convert)\         )\ )				
AfxA2WHelper používa MultiByteToWideChar urobiť konverziu.

MFC konverzie makrá použiť _alloca na pridelenie priestoru z programuzásobník pre konvertované reťazec. Priestor je automaticky deallocatedAk sa dokončil volanie procedúry. OLE vyžaduje OLE prideľovača napoužijú na všetky reťazce (údaje), ktoré budú pridelené jednej zložkya uvoľnené iný. To znamená, že reťazce prejsť cez vý-parametre a v-out-parametre OLE rozhraní musia prideliťs OLE prideľovača. Vstupné parametre nemusia rozdeliť s OLEPrideľovač pretože volajúci je zodpovedný za ich uvoľnenie. MostPrepájanie a Embedding OLE rozhrania a API preniesť struny ako vstupné parametre.Následne MFC konverzie makrá možno vo väčšine prípadov. VMFC konverzie makrá sa nemôže použi na in-out parametre alebo navykazujúcich hodnoty prostredníctvom out-parametre, pretože nemôže prideliťmiesta pomocou OLE prideľovača. AnsiToUnicode a UnicodeToAnsi môžu byťv týchto prípadoch použiť.

Ešte iný súbor rutiny konverzia Unicode/ANSI možno nájsť v DonBloku stĺpec v OLE v Microsoft systémy vestníku, August 1995, Vol. 10No. 8, stránku 86. Don Box definuje c ++ triedy s prevádzkovateľom odliatku ktoréVráti reťazec Unicode/ANSI skonvertujú. Vyhradený priestor jeautomaticky uvoľnených keď objekt dostane mimo rozsahu. Do tejto triedy môže byťmodifikovaných prideliť pomocou OLE prideľovača a nie voľnéhopridelené miesto na reťazce, ktoré prechádzajú cez-out alebo vý-parametre.

Jednej z tried String16, Don políčka stĺpca, ktorý konvertujeANSI reťazec Unicode, takto. Inej triedy, String8, podobnétohle sa používa ANSI Unicode konverzie. VCreateFileMoniker volanie z predchádzajúceho príkladu môžete vykonať taktos tejto triedy:
GetOpenFileName(&ofn);CreateFileMoniker(String16(ofn.lpstrFile), &pmk);				
V horeuvedenom kóde, sa vytvorí inštanciu triedy String16. Konštruktértriedy konvertovať reťazec ANSI na Unicode. Jazykimplementáciu budú volať odliatku prevádzkovateľom, prevádzkovateľ const wchar_t *,odovzdať tento parameter typu z CreateFileMoniker to prvýparameter. Prevádzkovateľ odliatku vráti reťazec Unicode, ktorý jeprejsť do CreateFileMoniker. Objekt bude expIoduje keď v goes vonpôsobnosť.
// String16 //////////////////////////////////////////////////////// // Shim class that converts both 8-bit (foreign) and// 16-bit (native) strings to 16-bit widenessclass String16 {public:// native and foreign constructors    String16(const char *p8);    String16(const wchar_t *p16);// non-virtual destructor (this class is concrete)  ~String16(void);// native conversion operator  operator const wchar_t * (void) const;private:// native wideness string    wchar_t *m_sz;// is foreign??    BOOL m_bIsForeign;// protect against assignment!  String16(const String16&);    String16& operator=(const String16&);};// native constructor is a pass-throughinline String16::String16(const wchar_t *p16): m_sz((wchar_t *)p16), m_bIsForeign(FALSE){}// simply give out the native wideness stringinline String16::operator const wchar_t * (void) const{  return m_sz;}// foreign constructor requires allocation of a native// string and conversioninline String16::String16(const char *p8): m_bIsForeign(TRUE){// calculate string length  size_t len = strlen(p8);// calculate required buffer size (some characters may// already occupy 16-bits under DBCS)  size_t size = mbstowcs(0, p8, len) + 1;// alloc native string and convert  if (m_sz = new wchar_t[size])    mbstowcs(m_sz, p8, size);}// delete native string only if synthesized in foreign constructorinline String16::~String16(void) {  if (m_bIsForeign)    delete[] m_sz;}				
konvertovať rutiny funkcie Pomocníka

Upozornenie: Tento článok bol preložený automaticky.

Vlastnosti

ID článku: 138813 – Posledná kontrola: 10/10/2011 11:13:00 – Revízia: 2.0

  • kbcode kbhowto kbprogramming kbmt KB138813 KbMtsk
Pripomienky
" + (window.location.protocol) + "//c.microsoft.com/ms.js'><\/script>");