OLE を ANSI から Unicode & Unicode ANSI からに変換するには、方法

文書翻訳 文書翻訳
文書番号: 138813
すべて展開する | すべて折りたたむ

概要

すべての文字列に渡され、32 ビット OLE Api から受信したとインターフェイス メソッドは、Unicode を使用します。これは、ANSI を使用するアプリケーションする必要があります。それらに、OLE に渡す前に Unicode に変換する文字列OLE から ansi に規格を受け取った Unicode 文字列に変換します。これ記事では、これらの変換の方法を示します。

詳細

Windows NT は、Unicode (ワイド文字) を実装し、ANSI バージョンのWin32 関数、文字列パラメーターを受け取る。ただし、Windows 95 はされていません。文字列を受け取るほとんどの Win32 関数の Unicode バージョンを実装します。パラメーターです。代わりに、これらの ANSI バージョンのみを実装します。機能します。

主な例外は、32 ビット OLE です。32 ビット OLE Api とインターフェイス メソッドでは、Windows NT や Windows 95 Unicode のみを使用します。ANSI バージョンのこれらの関数ではない Windows のいずれかを実装NT または Windows 95 を使用します。

これは、両方の Windows 上で実行する必要があります、32 ビット アプリケーションを意味します。95 と Windows NT ANSI バージョンの非 OLE Win32 を使用する必要があります。機能し、は、前に ANSI 文字列は Unicode に変換する必要がありますOLE に渡します。

Windows NT のみで実行される 32 ビット Unicode アプリケーションを使う必要はありません。ANSI または Unicode の変換関数。

プログラムによって、MultiByteToWideChar と WideCharToMultiByte 変換する Win32 を提供します。Unicode 文字列を ANSI および 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.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 アロケーターを使用してタイムアウト パラメーターを割り当てる必要があります。

文字列定数 Unicode にコンパイル時に使用して変換することができます。OLESTR のマクロです。たとえば。
CreateFileMoniker(OLESTR("c:\\boo\\har.doc"), &pmk);
				
もう 1 つの例の ANSI または Unicode 変換ルーチンにあります、Microsoft Foundation クラス (MFC) ソース コードに付属しています、Visual C 4.0 のコンパイラです。これらのルーチンは、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\srcOLE2T、T2OLE、OLE2CT、および T2COLE の使用、MFC ソース コード内で\msdev\mfc\src。これらの関数にコードを許可するのいずれかのコンパイルUnicode または ANSI かどうかに応じて、_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 文字列) をされます。_UNICODE が定義されていない場合は、文字列を ANSI です。LPTSTR と同様に定義されています。_UNICODE が定義されている場合は、Unicode 文字列へのポインターとポインター_UNICODE が定義されていない場合は、ANSI 文字列にします。T2OLE いずれかの操作を行いますしません。_UNICODE が定義されている場合の変換 (LPTSTR LPOLESTR = =)。Unicode定義されていない、A2W が呼び出されます。A2W として Unicode を ANSI 文字列に変換します。次に示します。
#define A2W(lpa) (\ 
        ((LPCSTR)lpa == NULL) ? NULL : (\ 
            _convert = (strlen(lpa)+1),\ 
            AfxA2WHelper((LPWSTR) alloca(_convert*2), lpa, _convert)\ 
        )\ 

)
				
AfxA2WHelper によって、MultiByteToWideChar 変換を行うには. します。

_Alloca MFC 変換マクロを使用して、プログラムからの領域を割り当てる変換後の文字列をスタックします。領域が自動的に割り当てを解除されます。ときは、プロシージャの呼び出しが完了しました。OLE は、OLE アロケーターをする必要があります。1 つのコンポーネントによって割り当てられるすべての文字列 (データ) を使用します。別によって解放されました。これは、文字列がアウト - を渡すことを意味します。パラメーターとで-タイムアウト-パラメーターの OLE インターフェイスを割り当てる必要があります。OLE アロケーターを使用します。In パラメーターが、OLE に配置する必要がないです。アロケーター呼び出し元が、解放する必要があるため。ほとんどリンクと埋め込み OLE インターフェイスと API で、パラメーターとして文字列を渡します。したがって MFC 変換マクロはほとんどの場合に使用できます。は、入出力パラメーターまたは MFC 変換マクロは使用できません。割り当てるしないため出力パラメーターを通じて値を返すOLE アロケーターを使用する領域。AnsiToUnicode および UnicodeToAnsi をすることができます。このような場合に使用します。

まだ別の一連の Unicode と ANSI 変換ルーチン境内にあります。OLE では、Microsoft システム履歴、1995 年 8 月、10 のボリューム ボックスの列No. 8、ページ 86Don Box、C++ クラスにキャスト演算子を定義する、Unicode または ANSI に変換する文字列を返します。割り当てられた領域です。オブジェクトがスコープ外に出るときは自動的に解放します。このクラスを使用できます。OLE アロケーターを使用して割り当ておよび解放に変更、空白でアウトまたは外に渡される文字列を割り当てるパラメーターです。

クラス、String16 を変換しない] ボックスの列の 1 つは、Unicode に ANSI 文字列を次に示します。他のクラスと似ています String8、この 1 つの ANSI から Unicode への変換に使用されます。は、CreateFileMoniker の呼び出しは、前の例から、次のようにできます。このクラスを使用します。
GetOpenFileName(&ofn);
CreateFileMoniker(String16(ofn.lpstrFile), &pmk);
				
上記のコードでは、String16 のインスタンスが作成されます。コンス トラクタークラスの ANSI 文字列は Unicode に変換されます。言語実装されますを呼び出して、キャスト演算子、演算子の const wchar_t *、このパラメーターには、CreateFileMoniker の種類にキャストするのパラメーターです。キャスト演算子は、Unicode 文字列を返します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 - 最終更新日: 2011年7月1日 - リビジョン: 4.0
キーワード:?
kbhowto kbprogramming kbcode kbmt KB138813 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:138813
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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