유니코드 및 ANSI 유니코드 ANSI에서에 대한 OLE 변환 방법

중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

138813
요약
전달된 및 32비트 OLE API 및 인터페이스 메서드를 통해 받은 모든 문자열을 유니코드를 사용합니다. ANSI 문자열을 OLE에 전달하기 전에 유니코드로 변환할 수 및 OLE에서 ANSI로 받은 유니코드 문자열을 변환하는 데 사용하는 응용 프로그램이 필요합니다. 이 문서에서는 이러한 변환을 수행할 수 있는 방법을 보여 줍니다.
추가 정보
Windows NT 구현하는 유니코드 또는 와이드 문자 및 문자열 매개 변수를 Win32 함수가 ANSI 버전. 그러나 Windows 95 유니코드 버전 문자열 매개 변수를 대부분의 Win32 기능을 구현하지 않습니다. 대신 이러한 함수의 ANSI 버전만을 구현합니다.

이 규칙의 주요 예외 32비트 OLE 것입니다. 32비트 OLE API 및 Windows NT 및 Windows 95에 대해 인터페이스 메서드를 유니코드를 단독으로 사용합니다. 이러한 함수는 ANSI 버전의 Windows NT 또는 Windows 95 구현되어 있지 않습니다.

즉, Windows 95 및 Windows NT 모두 실행하는 데 필요한 32 비트 응용 프로그램 비-OLE Win32 함수 ANSI 버전을 사용해야 합니다 하고 OLE에 전달되기 전에 ANSI 문자열을 유니코드로 변환해야 합니다.

Windows NT에서 실행되는 32 비트 유니코드 응용 프로그램은 모든 ANSI/유니코드 변환 함수를 사용할 필요가 없습니다.

Win32는 유니코드 문자열을 ANSI 및 유니코드 문자열을 ANSI로 변환할 MultiByteToWideChar 및 WideCharToMultiByte 제공합니다. 이 문서에서는 AnsiToUnicode 및 ANSI/유니코드 변환에 이러한 함수를 사용하는 UnicodeToAnsi 제공합니다.
/* * 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 구성 out-매개 변수로서 통해 반환되면 해당 구성 요소에 문자열을 확보 담당하기 때문에 변환된 문자열을 해제해야 하는지 않습니다. LPOLESTR은 유니코드 문자열에 대한 포인터입니다.
// 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 할당자를 사용하여 에서-out-매개 변수로 전달된 또는 Out 매개 변수를 또는 에서-Out 매개 변수를 통해 반환된 문자열은 할당해야 합니다.

문자열 상수는 유니코드로 컴파일할 때 OLESTR 매크로를 사용하여 변환할 수 있습니다. 예를 들어,:
CreateFileMoniker(OLESTR("c:\\boo\\har.doc"), &pmk);				
ANSI/유니코드 변환 루틴 다른 예로는 Visual C++ 4.0 컴파일러와 함께 제공되는 Microsoft Foundation 클래스 (MFC) 소스 코드를 찾을 수 있습니다. 이러한 루틴은 MFC Technote 59 설명되어 있습니다: ' MFC MBCS/유니코드 변환 매크로 사용 '. 정의를 에 \msdev\mfc\include\afxpriv.h OLE2T, T2OLE, OLE2CT, T2COLE, A2W, W2A, A2CW, W2CA 및 USES_CONVERSION 이러한 매크로가 있습니다. 또한 AfxA2WHelper 및 AfxW2AHelper \msdev\mfc\src 및 OLE2T, T2OLE, OLE2CT 및 T2COLE \msdev\mfc\src MFC 소스 코드의 사용을 MFC 소스 코드에서 참조하십시오. 이러한 함수는 코드를 유니코드 또는 ANSI _UNICODE 전처리기 정의를 이루어졌습니다 여부에 따라 컴파일할 수 있습니다. 예를 들어, 위의 예에서는 CreateFileMoniker 호출 다음과 같은 MFC 매크로를 만들 수 있습니다:
USES_CONVERSION;GetOpenFileName(&ofn);CreateFileMoniker(T2OLE(ofn.lpstrFile), &pmk);				
T2OLE _UNICODE 정의된 경우, 다음과 같이 정의됩니다:
inline LPOLESTR T2OLE(LPTSTR lp) { return lp; }				
T2OLE _UNICODE 정의되지 않은 경우 다음과 같이 정의됩니다:
#define T2OLE(lpa) A2W(lpa)				
T2OLE T _UNICODE 정의되지 않은 경우 OLE 문자열 (유니코드 문자열) 로 변환되는 형식 및 _UNICODE 정의할 때 유니코드 문자열을 ANSI 문자열로 나타냅니다. _UNICODE 정의되지 않은 경우 마찬가지로 LPTSTR _UNICODE 정의할 때 유니코드 문자열에 대한 포인터로 ANSI 문자열에 대한 포인터로 정의됩니다. _UNICODE가 정의되면 T2OLE 모든 변환을 수행하지 않습니다 (LPTSTR LPOLESTR ==). A2W는 유니코드 정의할 때 호출됩니다. A2W ANSI 문자열을 유니코드로 다음과 같이 변환합니다:
#define A2W(lpa) (\         ((LPCSTR)lpa == NULL) ? NULL : (\             _convert = (strlen(lpa)+1),\             AfxA2WHelper((LPWSTR) alloca(_convert*2), lpa, _convert)\         )\ )				
AfxA2WHelper MultiByteToWideChar 사용하여 변환을 수행합니다.

MFC 변환 매크로를 _alloca가 변환된 문자열 프로그램 스택 공간을 할당할 수 있습니다. 프로시저 호출이 완료될 때 공간은 자동으로 할당 해제됩니다. OLE OLE 할당자를 한 구성 요소에 의해 할당된 단추로 다른 해제된 모든 문자열을 (데이터) 사용할 수 있어야 합니다. 즉, 문자열을 Out 매개 변수를 통해 전달되며 에서-Out 매개 변수를 OLE 인터페이스를 사용하여 OLE 할당자 할당해야 합니다. 호출자가 해제하기 위한 담당하기 때문에 - 매개 변수는 OLE 할당자가 할당될 필요한지 않습니다. 대부분의 연결/포함 OLE 인터페이스 및 API 문자열을 매개 변수로 전달합니다. 따라서 대부분의 경우에 MFC 변환 매크로는 사용할 수 있습니다. -out 매개 변수에 대한 또는 OLE 할당자를 사용하여 공간을 할당하지 않기 때문에 Out 매개 변수를 통해 값을 반환하기 위한 MFC 변환 매크로는 사용할 수 없습니다. AnsiToUnicode 및 UnicodeToAnsi 이러한 경우에 사용할 수 있습니다.

아직 유니코드/ANSI 변환 루틴 집합은 다른 Microsoft 시스템 필기장에서 OLE Don 상자 열에 8월 1995 Vol. 10 번호 8, 페이지 86 찾을 수 있습니다. Don 상자 변환된 유니코드/ANSI 문자열을 반환하는 형변환 연산자 사용하여 C++ 클래스를 정의합니다. 해당 개체가 범위를 벗어날 때 할당된 공간이 자동으로 비워집니다. 이 클래스는 OLE 할당자를 사용하여 할당할 수 및 - out 또는 Out 매개 변수를 통해 전달된 문자열에 대해 할당된 공간을 확보하려면 수정할 수 있습니다.

ANSI 문자열을 유니코드로 변환하는 Don 상자 열의 String16, 클래스 중 하나를 따릅니다. 다른 클래스, 이 하나와 유사한 String8에 대한 ANSI 유니코드 변환에 사용됩니다. 이전 예제에서는 CreateFileMoniker 호출에서 이 클래스를 다음과 같이 만들 수 있습니다:
GetOpenFileName(&ofn);CreateFileMoniker(String16(ofn.lpstrFile), &pmk);				
위의 코드를 인 String16 인스턴스가 만들어집니다. 클래스의 생성자에 ANSI 문자열을 유니코드로 변환합니다. 언어 구현을 호출하여 캐스트 연산자, 연산자 const wchar_t *, CreateFileMoniker의 첫 번째 매개 변수의 유형이 매개 이 변수를 캐스팅해야 합니다. 캐스트 연산자 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;}				
도우미 루틴을 함수를 변환합니다

경고: 이 문서는 자동으로 번역되었습니다.

プロパティ

文書番号:138813 - 最終更新日: 03/16/2005 20:45:27 - リビジョン: 2.4

Microsoft OLE 4.0

  • kbmt kbcode kbhowto kbprogramming KB138813 KbMtko
フィードバック