أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

كيفية تحويل من ANSI إلى Unicode & Unicode إلى ANSI لـ OLE

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية138813
الموجز
استخدام كافة السلاسل التي يتم تمريرها إلى وتلقيها من 32-بت OLE APIs وأساليب واجهة Unicode. يتطلب هذا التطبيقات التي تستخدم سلاسل ANSI لتحويلها إلى Unicode قبل تمريرها إلى OLE و لتحويل سلاسل Unicode التي يتم تلقيها من OLE ANSI. يوضح هذا المقال كيف يمكن إجراء هذه التحويلات.
معلومات أخرى
يطبّق Windows NT Unicode (أو أحرف كبيرة) إصدارات دالات Win32 يستغرق معلمات سلسلة ANSI. ولكن لا يقوم نظام التشغيل Windows 95 إصدار Unicode معظم الدالات Win32 تأخذ معلمات السلسلة. بدلاً من ذلك بتنفيذ ANSI إصدارات هذه الدالات.

استثناء رئيسي لهذه القاعدة هو OLE 32-بت. 32-بت OLE APIs وأساليب واجهة على Windows NT و Windows 95 استخدام Unicode بشكل خاص. لم يتم تطبيق ANSI إصدارات هذه الدالات في Windows NT أو Windows 95.

هذا يعني أن تطبيق 32-بت ينبغي تشغيل على كل من Windows 95 و Windows NT يجب أن تستخدم إصدارات ANSI دالات ليست OLE Win32 عليك تحويل السلاسل ANSI إلى Unicode قبل أن يتم تمرير إلى OLE.

يجب عدم استخدام تطبيق Unicode 32-بت الذي يعمل على Windows NT فقط أية وظائف التحويل ANSI/Unicode.

Win32 يوفر MultiByteToWideChar WideCharToMultiByte لتحويل السلاسل ANSI إلى Unicode و سلاسل Unicode إلى ANSI. توفر هذه المقالة AnsiToUnicode UnicodeToAnsi الذي يستخدم هذه الدالات للتحويل ANSI/Unicode.
/* * 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;}				
استخدام نموذج هذه الدالات كما يلي. يتم استخدام CoTaskMemFree لتحرير سلسلة المحول إذا تم استخدام CoTaskMemAlloc تخصيص السلسلة. سلسلة المحول يجب أن لا يمكن تحرير إذا أرجع خلال معلمة مهلة إلى مكون OLE آخر لأن المكون مسؤولةً عن تحرير السلسلة. LPOLESTR مؤشر إلى سلسلة Unicode.
// 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);}				
ملاحظة: تعليقات في AnsiToUnicode و UnicodeToAnsi فيما يتعلق مخصص المستخدمة في تخصيص سلسلة المحول. مطلوب CoTaskMemAlloc (مخصص OLE) ليتم استخدامه فقط إذا كانت السلسلة الناتجة التي سيتم تمريرها إلى مكون OLE آخر وإذا كان هذا المكون يمكن تحرير السلسلة. يجب عدم استخدام هذا يعني أن السلاسل التي يتم تمريرها كمعلمات في إلى أساليب واجهة OLE مخصص OLE. يجب أن تكون السلاسل التي يتم تمريرها كمعلمات في- إخراج أو إرجاع خلال المهلة المعلمات في- إخراج - معلمات أو تخصيصها باستخدام مخصص OLE.

يمكن تحويل ثوابت السلسلة إلى Unicode في وقت التحويل البرمجي باستخدام ماكرو OLESTR. على سبيل المثال:
CreateFileMoniker(OLESTR("c:\\boo\\har.doc"), &pmk);				
يمكن العثور على مثال آخر من الإجراءات التحويل ANSI/Unicode في التعليمات البرمجية المصدر فئات Foundation لـ Microsoft "(MFC) الذي يأتي مع برنامج التحويل البرمجي 4.0 Visual C++. هذه الإجراءات الموضحة في Technote MFC 59: 'استخدام MFC MBCS/Unicode "تحويل ماكرو"'. التعريف وحدات الماكرو هذه OLE2T و T2OLE ، OLE2CT ، T2COLE ، A2W ، W2A ، A2CW ، W2CA و USES_CONVERSION قيد \msdev\mfc\include\afxpriv.h. راجع أيضاً AfxA2WHelper و AfxW2AHelper في التعليمات البرمجية المصدر MFC في \msdev\mfc\src و استخدام OLE2T و T2OLE OLE2CT و T2COLE في التعليمات البرمجية المصدر MFC في \msdev\mfc\src. تسمح هذه الدالات تعليمة برمجية يتم تحويلها برمجياً إما Unicode أو ANSI استناداً إلى ما إذا تم إجراء تعريف preprocessor _UNICODE. على سبيل المثال، استدعاء CreateFileMoniker في المثال أعلاه يمكن إجراء كما يلي مع وحدات الماكرو MFC:
USES_CONVERSION;GetOpenFileName(&ofn);CreateFileMoniker(T2OLE(ofn.lpstrFile), &pmk);				
إذا تم تعريف _UNICODE T2OLE تعريف كما يلي:
inline LPOLESTR T2OLE(LPTSTR lp) { return lp; }				
إذا لم يتم تعريف _UNICODE T2OLE تعريف كما يلي:
#define T2OLE(lpa) A2W(lpa)				
T في T2OLE تشير إلى نوع يتم تحويلها إلى سلسلة OLE (Unicode سلسلة) سلسلة Unicode عند تعريف _UNICODE و عبارة عن سلسلة ANSI عندما لم يتم تعريف _UNICODE. وبنفس LPTSTR يتم تعريف كمؤشر إلى سلسلة Unicode عند تعريف _UNICODE و كمؤشر إلى سلسلة ANSI عندما لم يتم تعريف _UNICODE. لا T2OLE أي التحويل عند تعريف _UNICODE (LPTSTR == LPOLESTR). عندما لم يتم تعريف Unicode يسمى A2W. A2W تحويل عبارة عن سلسلة ANSI إلى Unicode كما يلي:
#define A2W(lpa) (\         ((LPCSTR)lpa == NULL) ? NULL : (\             _convert = (strlen(lpa)+1),\             AfxA2WHelper((LPWSTR) alloca(_convert*2), lpa, _convert)\         )\ )				
AfxA2WHelper يستخدم MultiByteToWideChar لإجراء التحويل.

استخدام وحدات الماكرو التحويل MFC _alloca لتخصيص مساحة من المكدس البرنامج لسلسلة المحولة. يتم deallocated المساحة بشكل تلقائي عند اكتمال استدعاء الإجراء. يتطلب OLE مخصص OLE لاستخدامه في كافة السلاسل (البيانات) التي سيتم تخصيصها من قبل مكون واحد والإشارة تحريرها بواسطة آخر. يعني هذا أن السلاسل التي تم تمريرها من خلال معلمات إلغاء تخصيص في- إخراج - معلمات واجهات OLE مع مخصص OLE. في المعلمات تحتاج لا يمكن تخصيص مخصص OLE لأن المتصل مسؤولةً عن تحرير عليها. معظم الواجهات/Embedding ارتباطات OLE و API تمرير سلاسل كما في المعلمات. وبالتالي يمكن استخدام وحدات الماكرو التحويل MFC في معظم الحالات. لا يمكن استخدام وحدات الماكرو التحويل MFC معلمات مهلة أو إرجاع القيم خلال المهلة معلمات لأن أنها تخصيص مساحة باستخدام مخصص OLE. يمكن استخدام AnsiToUnicode و UnicodeToAnsi في هذه الحالات.

بعد آخر مجموعة إجراءات تحويل Unicode/ANSI يمكنك العثور على العمود Don مربع OLE في اليومية أنظمة Microsoft ، أغسطس 1995, 8 No. 10 Vol. 86 الصفحة. يحدد مربع Don فئة C++ مع عامل تشغيل الإضافة الذي ستقوم بإرجاع سلسلة أحرف Unicode/ANSI تحويل. يتم تلقائياً تحرير المساحة المخصصة عندما ينتقل الكائن خارج النطاق. يمكن تعديل هذه الفئة تخصيص باستخدام مخصص OLE و لم تحرير المساحة المخصصة لـ السلاسل التي تم تمريرها من خلال المهلة أو معلمات المهلة.

أحد الفئات ، String16 ، من العمود Don مربع الذي يحول عبارة عن سلسلة ANSI إلى Unicode ، يتبع. يتم استخدام فئة أخرى String8 مشابهة إلى هذا ANSI إلى Unicode التحويل. يمكن إجراء مكالمة CreateFileMoniker من المثال السابق كما يلي مع هذه الفئة:
GetOpenFileName(&ofn);CreateFileMoniker(String16(ofn.lpstrFile), &pmk);				
يتم إنشاء مثيل String16 في التعليمات البرمجية أعلاه. سوف مُنشئ الفئة تحويل السلسلة ANSI إلى Unicode. سيتم تطبيق لغة استدعاء عامل تشغيل الإضافة ، wchar_t const عامل تشغيل * ، على تحويل هذه المعلمة إلى نوع المعلمة الأولى الخاص CreateFileMoniker. عامل تشغيل الإضافة بإرجاع سلسلة أحرف Unicode التي يتم تمريرها إلى CreateFileMoniker. سوف destruct الكائن في الانتقال خارج النطاق.
// 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;}				
تحويل دالات إجراءات المساعد

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 138813 - آخر مراجعة: 03/16/2005 20:45:27 - المراجعة: 2.4

Microsoft OLE 4.0

  • kbmt kbcode kbhowto kbprogramming KB138813 KbMtar
تعليقات