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

기술 자료 번역 기술 자료 번역
기술 자료: 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.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);

}
				
참고: 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 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;

}
				

속성

기술 자료: 138813 - 마지막 검토: 2005년 3월 16일 수요일 - 수정: 2.4
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft OLE 4.0?을(를) 다음과 함께 사용했을 때
    • Microsoft Windows NT 3.51 서비스 팩 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
키워드:?
kbmt kbcode kbhowto kbprogramming KB138813 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

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