Nasıl yapılır: ANSı'DEN Unicode'a Unicode ve ANSI için için OLE Dönüştür

Makale çevirileri Makale çevirileri
Makale numarası: 138813 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Özet

Geçirilen ve 32-bit OLE Apı'leri ve arabirim yöntemleri alınan tüm dizeleri Unicode kullanın. Bu, ANSI dizesi için OLE geçirmeden önce onları Unicode'a dönüştürme ve OLE ANSı'YE alınan Unicode dizelerinin dönüştürmek kullanan uygulamalar gerektirir. Bu makalede, bu dönüştürmeler nasıl yapılacağı gösterilmektedir.

Daha fazla bilgi

Unicode (veya geniş bir karakter), Windows NT uygular ve ANSI sürümleri Win32 işlevlerin dize parametreleri alır. Ancak Windows 95, Unicode sürümü dizesini parametre çoğu Win32 işlevlerini uygulamıyor. Bunun yerine yalnızca ANSI sürümleri bu işlevleri gerçekleştirir.

Bir ana bu kuralın istisnası, 32-bit OLE ' dir. Unicode, yalnızca 32-bit OLE Apı'lar ve Windows NT ve Windows 95 arabirim yöntemleri kullanın. Bu işlevler ANSI sürümünü, Windows NT veya Windows 95 uygulanmadı.

Bu, Windows 95 ve Windows NT'DE çalışması için gereken bir 32-bit uygulama OLE Win32 dışı işlevleri ANSI sürümünü kullanmalısınız ve bunlar için OLE geçirilmeden önce ANSI dizesi Unicode'a dönüştürme anlamına gelir.

Windows NT'DE çalışan 32 bitlik bir Unicode uygulama herhangi bir ANSı/Unicode dönüştürme işlevleri kullanmanız.

Win32 MultiByteToWideChar ve WideCharToMultiByte ANSI dizesi, Unicode ve Unicode dize ANSı'YE dönüştürmek için alan sağlar. Bu makalede, AnsiToUnicode ve ANSı/Unicode dönüşümü için bu işlevleri kullanan UnicodeToAnsi sağlar.
/*
 * 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;

}
				
Örnek bu işlevlerin aşağıdaki gibi kullanılır. CoTaskMemFree CoTaskMemAlloc dizeyi ayırmaya kullandıysanız, dönüştürülmüş dize boşaltmak için kullanılır. Başka bir OLE bileşen için bir çıkış parametresi döndürdü, bu bileşen dizesini boşaltmak için sorumlu olduğundan dönüştürülmüş dize serbest gerekir değil. LPOLESTR bir Unicode dizesi bir işaretçidir.
// 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.lpstrFile

GetOpenFileName(&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);

}
				
Not: AnsiToUnicode ve UnicodeToAnsi dönüştürülmüş dizesini ayırmak için kullanılan ayırıcı ilgili açıklama. Yalnızca sonuç dizesini başka bir OLE bileşenini gönderilir ve bu bileşen, dize boşaltabilirsiniz kullanılacak CoTaskMemAlloc (OLE ayırıcısı) gereklidir. OLE arabirim yöntemleri için-parametreleri olarak geçirilen dizeler, bunun anlamı, OLE ayırıcısı kullanmaması. De-out-parametreleri olarak geçirilen veya out parametreleri veya içinde-out-Parametreler döndürdü dizeleri OLE ayırıcısı kullanarak ayrılması gerekir.

Dize sabitleri Unicode'a OLESTR makro kullanarak derleme zamanında dönüştürülebilir. Örneğin:
CreateFileMoniker(OLESTR("c:\\boo\\har.doc"), &pmk);
				
başka örnek ANSı/Unicode dönüştürme yordamlar, Visual C++ 4.0 Derleyici ile birlikte gelen Microsoft Foundation Classes (MFC) hizmet (SRV) kaynak kodu bulunamıyor. Bu yordamlar, MFC Teknik Notu 59 içinde açıklanan: 'MFC MBCS/Unicode dönüşümü makroları kullanma'. Tanımı \msdev\mfc\include\afxpriv.h bu makroları OLE2T T2OLE, OLE2CT, T2COLE, A2W, W2A, A2CW, W2CA ve USES_CONVERSION var. Ayrıca \msdev\mfc\src ve kullanımını OLE2T T2OLE, OLE2CT ve T2COLE \msdev\mfc\src MFC kaynak kodundaki MFC kaynak kodundaki AfxA2WHelper ve AfxW2AHelper bakın. Bu işlevler kodu için Unicode veya ANSI olup _UNICODE Önişlemci tanım yapıldı bağlı Derlenecek izin ver. Örneğin, yukarıdaki örnekte CreateFileMoniker çağrısı gibi MFC makrolarla yapılabilir:
USES_CONVERSION;
GetOpenFileName(&ofn);
CreateFileMoniker(T2OLE(ofn.lpstrFile), &pmk);
				
T2OLE _UNICODE tanımlanır, aşağıdaki gibi tanımlanır:
inline LPOLESTR T2OLE(LPTSTR lp) { return lp; }
				
T2OLE _UNICODE tanımlanır, aşağıdaki gibi tanımlanır:
#define T2OLE(lpa) A2W(lpa)
				
T2OLE, T _UNICODE tanımlı değil, bir OLE dizesi (Unicode dizesi) dönüştürülen türü _UNICODE tanımlandığında, bir Unicode dize ve bir ANSI dizesi olduğunu gösterir. Benzer şekilde _UNICODE tanımlanmamışsa, LPTSTR _UNICODE tanımlandığında, bir Unicode dize işaretçisi ve bir ANSI dizesi işaretçisi olarak tanımlanır. _UNICODE tanımlandığında T2OLE herhangi bir dönüştürme yapmaz (LPTSTR LPOLESTR ==). Unicode tanımlandığında, A2W denir. Unicode'a alanı'ndaki bir ANSI dizesi A2W gibi dönüştürür:
#define A2W(lpa) (\ 
        ((LPCSTR)lpa == NULL) ? NULL : (\ 
            _convert = (strlen(lpa)+1),\ 
            AfxA2WHelper((LPWSTR) alloca(_convert*2), lpa, _convert)\ 
        )\ 

)
				
dönüştürme yapmak için MultiByteToWideChar AfxA2WHelper kullanır.

MFC makroları dönüştürme, dönüştürülen dizesi için <a1>program</a1> yığından alanı ayırmaya _alloca kullanın. Yordamın çağrısı tamamlandığında, alan otomatik olarak ayırmanın. OLE bir bileşen tarafından ayrılan ve başka tarafından serbest bırakılan tüm dizeler (veri) için kullanılacak OLE ayırıcısı gerektirir. Bu, dizeleri çıkış parametreleri Gözden geçirildi ve,-out-parametrelerinin OLE arabirimleri ile OLE ayırıcısı ayrılmış anlamına gelir. Arayanın boşaltmak için sorumlu olduğundan-Parametreler OLE ayırıcısı ile atanmamış. Çoğu Bağlantı/katıştırma OLE arabirimleri ve API dizeleri içinde-parametre olarak geçirmek. Sonuç olarak MFC dönüştürme makrolar, çoğu durumda kullanılabilir. MFC dönüştürme makroları-out parametreleri veya OLE ayırıcısı kullanarak alan ayırmak için çıkış parametreleri aracılığıyla değerlerini döndürmek için kullanılamaz. AnsiToUnicode ve UnicodeToAnsi bu gibi durumlarda kullanılabilir.

Henüz başka bir Unicode/ANSı dönüştürme yordamlar, Microsoft Systems Journal'da OLE Don Box'ın sütunundaki Ağustos 1995, Vol. 10 No 8 sayfa 86 bulunabilir. Don Box, Unicode/dönüştürülmüş ANSI dizeyi döndürür bir atama işleci ile bir C++ sınıfı tanımlar. Nesne kapsam dışında gittiğinde ayrılan alan otomatik olarak serbest. Bu sınıf, OLE ayırıcısı kullanarak ayrılacak ve, çıkış veya out parametreleri aracılığıyla geçirilen dizeleri için ayrılmış olan alan boşaltmak için değiştirilebilir.

Sınıflar, String16, bir ANSI dizesi, Unicode'a dönüştürür; Don Box'ın sütundan birini izler. Bu bir benzer String8 başka bir sınıf için ANSI, Unicode dönüşümü için kullanılır. Bu sınıf önceki örnekte CreateFileMoniker çağrısından gibi yapılabilir:
GetOpenFileName(&ofn);
CreateFileMoniker(String16(ofn.lpstrFile), &pmk);
				
yukarıdaki kodu, String16 örneği oluşturulur. Sınıf oluşturucu ANSI dizesi Unicode'a dönüştürür. Dil uygulaması çağıracaktır atama işleci, işletmen const wchar_t *, bu parametre CreateFileMoniker'ın ilk parametre türüne atama. Atama işleci için CreateFileMoniker geçirilen bir Unicode dizesi döndürür. Nesne kapsam dışında gider ile destruct.
// String16 //////////////////////////////////////////////////////// 
// Shim class that converts both 8-bit (foreign) and
// 16-bit (native) strings to 16-bit wideness

class 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-through

inline String16::String16(const wchar_t *p16)
: m_sz((wchar_t *)p16), m_bIsForeign(FALSE)
{
}

// simply give out the native wideness string

inline String16::operator const wchar_t * (void) const
{
  return m_sz;
}

// foreign constructor requires allocation of a native
// string and conversion

inline 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 constructor

inline String16::~String16(void) {
  if (m_bIsForeign)

    delete[] m_sz;

}
				

Özellikler

Makale numarası: 138813 - Last Review: 16 Mart 2005 Çarşamba - Gözden geçirme: 2.4
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft OLE 4.0, Ne zaman ne ile kullanilir:
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
Anahtar Kelimeler: 
kbmt kbcode kbhowto kbprogramming KB138813 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:138813

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com