Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để chuyển đổi từ ANSI tới Unicode & Unicode để ANSI cho OLE

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:138813
TÓM TẮT
Tất cả các dây được truyền cho và nhận được từ 32-bit OLE API vàphương pháp giao diện sử dụng Unicode. Điều này đòi hỏi các ứng dụng sử dụng ANSIdây để chuyển chúng đến Unicode trước khi đi qua họ để OLE và đếnchuyển đổi Unicode dây nhận được từ OLE để ANSI. Điều nàyđiều đó chứng tỏ làm thế nào các chuyển đổi có thể được thực hiện.
THÔNG TIN THÊM
Windows NT thực hiện Unicode (hay nhiều ký tự) và ANSI Phiên bản củaWin32 chức năng mà phải mất các thông số chuỗi. Tuy nhiên Windows 95 khôngthực hiện phiên bản Unicode hầu hết chức năng Win32 mất chuỗicác tham số. Thay vào đó nó thực hiện chỉ ANSI bản nàychức năng.

Một ngoại lệ lớn cho quy tắc này là 32-bit OLE. 32-bit OLE API vàsử dụng phương pháp giao diện trên Windows NT và Windows 95 Unicode độc quyền.ANSI Phiên bản của các chức năng này là không thực hiện hoặc trên WindowsNT hoặc Windows 95.

Điều này có nghĩa là một ứng dụng 32-bit rằng cần phải chạy trên cả Windows95 và Windows NT phải sử dụng phiên bản ANSI của các phi - OLE Win32chức năng và phải ANSI dây để chuyển đổi Unicode trước khi chúngthông qua với OLE.

Một ứng dụng Unicode 32-bit chỉ chạy trên Windows NT cần không sử dụngbất kỳ chức năng chuyển đổi ANSI/Unicode.

Win32 cung cấp MultiByteToWideChar và WideCharToMultiByte để chuyển đổiANSI dây tới Unicode và Unicode dây để ANSI. Bài viết nàycung cấp AnsiToUnicode và UnicodeToAnsi, trong đó sử dụng các chức năng này choANSI/Unicode chuyển đổi.
/* * 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;}				
Mẫu sử dụng các chức năng này là như sau. CoTaskMemFree được sử dụng đểmiễn phí chuyển đổi chuỗi nếu CoTaskMemAlloc được sử dụng để phân bổ cácchuỗi. Chuỗi chuyển đổi không phải được tự do nếu nó được trả về thông quamột tham số ra đến một OLE thành phần, vì thành phần đó làchịu trách nhiệm về giải phóng chuỗi. LPOLESTR là một con trỏ chỉ tới một Unicodechuỗi.
// 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);}				
LƯU Ý: Ý kiến tại AnsiToUnicode và UnicodeToAnsi liên quan đến cáccấp phát được sử dụng để phân bổ chuỗi được cải biến. CoTaskMemAlloc(cấp phát OLE) được yêu cầu để được sử dụng chỉ khi chuỗi kết quảsẽ được thông qua với một OLE thành phần và nếu thành phần đó có thể giải phóngcác chuỗi. Này có nghĩa là chuỗi đó được thông qua như trong tham số đểOLE phương pháp giao diện cần không sử dụng cấp phát OLE. Chuỗi đượcthông qua như là tham trong-ra-số hoặc quay trở lại thông qua các tham số ra hoặc trong –ra-tham số phải được cấp phát bằng cách sử dụng cấp phát OLE.

Hằng số chuỗi có thể được chuyển đổi sang Unicode tại thời gian biên dịch bằng cách sử dụngvĩ mô OLESTR. Ví dụ:
CreateFileMoniker(OLESTR("c:\\boo\\har.doc"), &pmk);				
Một ví dụ khác của ANSI/Unicode thói quen chuyển đổi có thể được tìm thấy trong cácMicrosoft nền tảng Classes (MFC) mã nguồn mà tàu với cácVisual C++ 4,0 biên dịch. Những thói quen được mô tả trong MFC Technote59: 'Bằng cách sử dụng MFC MBCS/Unicode chuyển đổi Macros'. Định nghĩa nàymacro OLE2T, T2OLE, OLE2CT, T2COLE, A2W, W2A, A2CW, W2CA vàUSES_CONVERSION là trong \msdev\mfc\include\afxpriv.h. Cũng xemAfxA2WHelper và AfxW2AHelper trong MFC nguồn mã trong \msdev\mfc\srcvà sử dụng OLE2T, T2OLE, OLE2CT và T2COLE trong MFC mã nguồn trong\msdev\mfc\src. Các chức năng này cho phép mã biên soạn hoặc choUnicode hoặc ANSI tùy thuộc vào việc _UNICODE preprocessorđịnh nghĩa đã được thực hiện. Ví dụ, CreateFileMoniker gọi trong cácở trên ví dụ có thể được thực hiện như sau với các macro MFC:
USES_CONVERSION;GetOpenFileName(&ofn);CreateFileMoniker(T2OLE(ofn.lpstrFile), &pmk);				
Nếu _UNICODE được định nghĩa, T2OLE được định nghĩa như sau:
inline LPOLESTR T2OLE(LPTSTR lp) { return lp; }				
Nếu _UNICODE không được xác định, T2OLE được định nghĩa như sau:
#define T2OLE(lpa) A2W(lpa)				
T tại T2OLE chỉ ra rằng loại đang được chuyển đổi thành một chuỗi OLE(Unicode chuỗi) là một chuỗi Unicode khi _UNICODE được xác định và mộtANSI chuỗi khi _UNICODE không xác định. Tương tự như vậy LPTSTR được định nghĩa làmột con trỏ đến một chuỗi Unicode khi _UNICODE được định nghĩa và như là một con trỏđể một chuỗi ANSI khi _UNICODE không xác định. T2OLE không làm bất kỳchuyển đổi khi _UNICODE được định nghĩa (LPTSTR == LPOLESTR). Khi Unicodelà không xác định, A2W được gọi là. A2W chuyển đổi một chuỗi ANSI tới Unicode nhưsau:
#define A2W(lpa) (\         ((LPCSTR)lpa == NULL) ? NULL : (\             _convert = (strlen(lpa)+1),\             AfxA2WHelper((LPWSTR) alloca(_convert*2), lpa, _convert)\         )\ )				
AfxA2WHelper sử dụng MultiByteToWideChar để làm việc chuyển đổi.

MFC chuyển đổi macro sử dụng _alloca để cấp phát vũ trụ từ chương trìnhngăn xếp cho chuỗi được cải biến. Không gian là tự động deallocatedkhi các cuộc gọi thủ tục đã hoàn tất. OLE đòi hỏi cấp phát OLE đểđược sử dụng cho tất cả các dây (dữ liệu) mà sẽ được cấp phát bởi một trong những thành phầnvà tự do của người khác. Điều này có nghĩa rằng dây qua ra-tham số và thông trong-ra-số lượng giao diện OLE phải được cấp phátvới cấp phát OLE. Trong các tham số không cần được giao với các OLEcấp phát bởi vì người gọi là trách nhiệm giải phóng chúng. Hầu hếtLiên kết/gắn OLE giao diện và API vượt qua chuỗi như trong tham số.Kết quả là các macro MFC chuyển đổi có thể được sử dụng trong hầu hết trường hợp. CácMFC chuyển đổi macro không thể được sử dụng cho các tham số trong ra hoặctrở về giá trị thông qua các tham số ra vì họ không phân bổvũ trụ bằng cách sử dụng cấp phát OLE. AnsiToUnicode và UnicodeToAnsi có thểđược sử dụng trong các trường hợp.

Được một tập hợp các thói quen chuyển đổi Unicode/ANSI có thể được tìm thấy trong DonHộp của cột ngày OLE trong Microsoft Systems Journal, tháng 8 năm 1995, Vol. 10Số 8 (trang 86). Don hộp định nghĩa một class C++ với một nhà điều hành diễn viên màsẽ trả về một chuỗi Unicode/ANSI chuyển đổi. Không gian được phân bổ làtự động giải phóng khi đối tượng đi ra khỏi phạm vi. Lớp này có thểSửa đổi cấp phát bằng cách sử dụng cấp phát OLE và để không giải phóng cácphân bổ vũ trụ cho dây được truyền thông qua trong ra hoặc ra-các tham số.

Một trong các lớp học, String16, từ Don hộp cột mà chuyển đổi mộtANSI chuỗi tới Unicode, sau. Một lớp học, String8, mà là tương tự nhưđể điều này được dùng cho ANSI để chuyển đổi Unicode. CácCreateFileMoniker gọi từ các ví dụ trước có thể được thực hiện như sauvới lớp này:
GetOpenFileName(&ofn);CreateFileMoniker(String16(ofn.lpstrFile), &pmk);				
Trong mã ở trên, một thể hiện của String16 được tạo ra. Các nhà xây dựnglớp sẽ chuyển đổi chuỗi ANSI tới Unicode. Ngôn ngữthực hiện sẽ gọi cho các diễn viên điều hành, nhà điều hành const wchar_t *,boû tham số này để loại của CreateFileMoniker đầu tiêntham số. Các nhà điều hành diễn viên sẽ trả về chuỗi Unicode mà làđược thông qua để CreateFileMoniker. Các đối tượng sẽ huỷ khi trong đi raphạm vi.
// 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;}				
chuyển đổi chức năng helper thói quen

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 138813 - Xem lại Lần cuối: 08/18/2011 08:34:00 - Bản sửa đổi: 2.0

  • kbcode kbhowto kbprogramming kbmt KB138813 KbMtvi
Phản hồi
>