你目前正处于脱机状态,正在等待 Internet 重新连接

你的浏览器不受支持

你需要更新你的浏览器才能使用该网站。

更新到 Internet Explorer 的最新版本

如何将 ole 从 ANSI 转换为 Unicode & 为 ANSI Unicode

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 138813
概要
所有字符串传递给和接收从 32 位 OLE Api andinterface 方法都使用 Unicode。这就要求应用程序使用 ANSIstrings 来将它们传递到 OLE 和 toconvert 从 OLE 接收为 ANSI Unicode 字符串之前将其转换为 Unicode。Thisarticle 说明可以如何完成这些转换。
更多信息
Windows NT 实现 Unicode (或宽字符) 和 ANSI 版本 ofWin32 函数接受字符串参数。然而 Windows 95 没有 notimplement stringparameters 的大多数 Win32 函数的 Unicode 版本。相反,它实现 thesefunctions 的 ANSI 版本。

此规则主要的例外是 32 位 OLE。32 位 Windows NT,Windows 95 的 OLE Api andinterface 方法以独占方式使用 Unicode。这些函数中的 ANSI 版本 windows Nt 或 Windows 95 上未实现。

这意味着需要在 Windows95 和 Windows NT 上运行的 32 位应用程序必须使用 ANSI 版本的非-OLE Win32functions 和必须 ANSI 字符串前转换为 Unicode 他们给 OLE arepassed。

仅在 Windows NT 运行的 32 位 Unicode 应用需要不 useany ANSI/Unicode 转换函数。

Win32 提供 convertANSI 字符串转换为 Unicode 和 Unicode 字符串转换为 ANSI MultiByteToWideChar 和 WideCharToMultiByte。该 articleprovides AnsiToUnicode 和 UnicodeToAnsi,使用这些函数 forANSI/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;}				
这些函数的示例用法如下所示。如果被用于分配 thestring CoTaskMemAlloc,CoTaskMemFree 是用的 tofree 转换的字符串。转换后的字符串必须不会释放如果 throughan out 参数返回到另一个 OLE 组件,因为该组件 isresponsible 释放字符串。LPOLESTR 是一个指针,指向 Unicodestring。
// 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 theallocator,用于分配转换后的字符串有关的注释。CoTaskMemAlloc (OLE 分配器) 需要只有得到 stringwill 传递到另一个 OLE 组件,并且该组件可以 freethe 字符串使用。这意味着,字符串作为输入参数 toOLE 接口方法传递无需使用 OLE 分配器。字符串必须使用 OLE 分配器分配作为输入输出参数或通过 out 参数或在输出参数中返回的 arepassed。

字符串常量可以被转换为 Unicode 在编译时由 usingthe OLESTR 宏。例如:
CreateFileMoniker(OLESTR("c:\\boo\\har.doc"), &pmk);				
在 theMicrosoft 基础类 (MFC) 源代码随可视设计 c + + 4.0 编译器找不到另一个 ANSI/Unicode 转换例程的示例。这些例程详见 MFC Technote59: 使用 MFC MBCS/Unicode 转换宏。定义 thesemacros OLE2T,T2OLE、 OLE2CT、 T2COLE、 现象、 W2A、 A2CW,W2CA andUSES_CONVERSION 是在 \msdev\mfc\include\afxpriv.h 中。同时 seeAfxA2WHelper 和 AfxW2AHelper 在 \msdev\mfc\srcand OLE2T、 T2OLE、 OLE2CT 和 T2COLE 在 MFC 源代码代码 in\msdev\mfc\src 中使用 MFC 源代码中。这些函数允许代码进行编译 ANSI 根据是否已进行 _UNICODE preprocessordefinition 或者 forUnicode。例如,theabove 示例中的 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)				
在 T2OLE T 表示正在转换为 OLE 字符串 (Unicode 字符串) 的类型是一个 Unicode 字符串定义 _UNICODE 时和 anANSI 字符串未定义 _UNICODE 时。同样 LPTSTR 是一个 Unicode 字符串,定义 _UNICODE 时和 pointerto 非 ANSI 字符串用作定义的 asa 指针未定义 _UNICODE 时。当定义 _UNICODE,T2OLE 不执行 anyconversion (LPTSTR = = LPOLESTR)。Unicodeis 未定义时,称为现象。现象将 ANSI 字符串转换为 Unicode asfollows:
#define A2W(lpa) (\         ((LPCSTR)lpa == NULL) ? NULL : (\             _convert = (strlen(lpa)+1),\             AfxA2WHelper((LPWSTR) alloca(_convert*2), lpa, _convert)\         )\ )				
AfxA2WHelper 使用 MultiByteToWideChar 来执行转换。

MFC 转换宏使用 _alloca 从转换后的字符串 programstack 分配空间。空间是自动完成的过程调用 deallocatedwhen。OLE 需要 OLE 分配器要使用由另一个组件分配的所有字符串 (数据)。通过 out 参数传递的字符串这意味着,在 out 参数的 OLE 接口必须是 allocatedwith OLE 分配器。由于调用方负责中解放出来,不需要使用 OLEallocator 分配参数中。MostLinking/嵌入 OLE 接口和 API 作为参数中传递字符串。因此在大多数情况下可以使用 MFC 转换宏。TheMFC 转换宏不能用于输入输出参数或通过 out 参数的 forreturning 值因为它们不使用 OLE 分配器的 allocatespace。AnsiToUnicode 和 UnicodeToAnsi 可以在这些情况下使用。

而另一组 Unicode/ANSI 转换例程可以 1995 年 8 月,发现在 Microsoft 的系统日志中,OLE DonBox 的列中第 10No。 8,第 86 页。Don Box 定义返回强制转换运算符 whichwill c + + 类的 Unicode/ANSI 转换字符串。当该对象超出范围时释放已分配的空间 isautomatically。此类可以使用 OLE 分配器的分配并不释放通过输入输出或 out 参数传递的字符串的 theallocated 空间的 bemodified。

一个类,String16,从它将 anANSI 字符串转换为 Unicode,Don Box 列如下。另一类,String8,similarto 这样的 Unicode 转换到使用 ANSI。前面的示例中的 TheCreateFileMoniker 调用可作为 followswith 此类:
GetOpenFileName(&ofn);CreateFileMoniker(String16(ofn.lpstrFile), &pmk);				
在上面的代码中,创建 String16 的实例。Constructorof 类会将 ANSI 字符串转换为 Unicode。Languageimplementation 调用强制转换运算符,运算符常量 wchar_t *、 强制转换为 CreateFileMoniker 的 firstparameter 类型的此参数。强制转换运算符将返回 Unicode 字符串的 ispassed 到 CreateFileMoniker。在超出范围时,将销毁该对象。
// 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;}				
将转换的帮助器例程函数

警告:本文已自动翻译

属性

文章 ID:138813 - 上次审阅时间:09/27/2015 05:14:00 - 修订版本: 3.0

  • kbcode kbhowto kbprogramming kbmt KB138813 KbMtzh
反馈
om/ms.js'><\/script>");