Τρόπος μετατροπής από ANSI σε Unicode & Unicode σε ANSI για αντικείμενα OLE

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 138813
Ανάπτυξη όλων | Σύμπτυξη όλων

Περίληψη

Όλες οι συμβολοσειρές που διαβιβάζεται και λαμβάνεται από 32-bit OLE APIs και διασύνδεση μέθοδοι χρησιμοποιούν Unicode. Αυτό απαιτεί εφαρμογές που χρησιμοποιούν ANSI συμβολοσειρές για να μετατρέψετε σε Unicode πριν να τις μεταβιβάσουν να OLE και να Για να μετατρέψετε συμβολοσειρές Unicode που λαμβάνονται από OLE ANSI. Αυτό το άρθρο επιδεικνύει τον τρόπο μπορεί να γίνει αυτές τις μετατροπές.

Περισσότερες πληροφορίες

Τα Windows NT υλοποιεί Unicode (ή πλατύ χαρακτήρα) και εκδόσεις ANSI του Συναρτήσεις Win32 που λαμβάνουν παραμέτρους συμβολοσειράς. Ωστόσο τα Windows 95 δεν υλοποίηση έκδοση Unicode του περισσότερες συναρτήσεις Win32 που λαμβάνουν συμβολοσειράς παράμετροι. Αντίθετα υλοποιεί μόνο τις εκδόσεις ANSI αυτών συναρτήσεις.

Κύρια εξαίρεση στον κανόνα αυτό είναι 32-bit OLE. 32-bit OLE APIs και μέθοδοι διασύνδεσης των Windows NT και Windows 95 χρησιμοποιούν αποκλειστικά Unicode. Εκδόσεις ANSI αυτών των συναρτήσεων δεν είναι υλοποιούνται είτε σε Windows NT ή Windows 95.

Αυτό σημαίνει ότι μια εφαρμογή 32-bit που χρειάζεται να εκτελέσετε τόσο τα Windows 95 και Windows NT, πρέπει να χρησιμοποιήσετε τις εκδόσεις ANSI του μη - OLE Win32 συναρτήσεις και πρέπει να μετατρέψετε συμβολοσειρές ANSI σε Unicode, προτού διαβιβάστηκε OLE.

Δεν χρειάζεται χρησιμοποιείτε μια εφαρμογή Unicode 32-bit που εκτελείται μόνο σε 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 χρησιμοποιήθηκε για την εκχώρηση του συμβολοσειρά. Δεν πρέπει να απελευθερωθεί η μετατροπή συμβολοσειράς εάν επιστραφεί μέσω μια παράμετρος out για ένα άλλο στοιχείο 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. Συμβολοσειρές που είναι πέρασε ως out-παραμέτρων ή επιστρέφονται μέσω παράμετροι out ή σε- παράμετροι Out πρέπει να εκχωρηθεί χρησιμοποιώντας το πρόγραμμα εκχώρησης OLE.

Οι σταθερές συμβολοσειράς που μπορεί να μετατραπεί σε Unicode κατά τη μεταγλώττιση χρησιμοποιώντας η μακροεντολή OLESTR. Για παράδειγμα:
CreateFileMoniker(OLESTR("c:\\boo\\har.doc"), &pmk);
				
Μπορείτε να βρείτε ένα άλλο παράδειγμα ρουτίνες μετατροπή ANSI/Unicode σε το Κωδικός προέλευσης MFC (Microsoft Foundation κλάσεις) που συνοδεύει το Πρόγραμμα μεταγλώττισης Visual C++ 4.0. Αυτές οι ρουτίνες περιγράφονται στην MFC Technote 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, ανάλογα εάν προεπεξεργαστή _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 απαιτεί χρησιμοποιείται για όλες τις συμβολοσειρές (δεδομένα) που θα εκχωρηθεί από ένα στοιχείο και ελευθερώνονται από άλλο. Αυτό σημαίνει ότι συμβολοσειρές πέρασε out- πρέπει να εκχωρηθούν παραμέτρους στο-out-παραμέτρους και διασυνδέσεις OLE με το πρόγραμμα εκχώρησης OLE. Δεν πρέπει να εκχωρηθεί σε παραμέτρους με το OLE πρόγραμμα εκχώρησης επειδή ο καλών είναι υπεύθυνος για την απελευθέρωση τους. Οι περισσότερες Σύνδεση ενσωμάτωση OLE διασυνδέσεις API και να διαβιβάζουν συμβολοσειρές ως σε παραμέτρους. Κατά συνέπεια οι μακροεντολές μετατροπής MFC μπορούν να χρησιμοποιηθούν στις περισσότερες περιπτώσεις. Το Μακροεντολές MFC μετατροπής δεν μπορεί να χρησιμοποιηθεί για παραμέτρους-out ή επιστρέφει τιμές μέσω παράμετροι out επειδή δεν εκχώρηση χρησιμοποιώντας το πρόγραμμα OLE εκχώρησης χώρου. Μπορεί να είναι AnsiToUnicode και UnicodeToAnsi χρησιμοποιείται σε αυτές τις περιπτώσεις.

Ακόμα ένα άλλο σύνολο ρουτινών μετατροπή Unicode/ANSI μπορεί να βρεθεί στο Don Στήλη πλαισίου στο OLE στη Microsoft συστήματα εγγραφών, Αυγούστου 1995, Vol. 10 Αρ. 8 σελίδα 86. Πλαίσιο Don ορίζει μια κλάση C++ με έναν τελεστή μετατροπής που θα επιστρέψει μια συμβολοσειρά μετατροπή Unicode/ANSI. Δεσμευμένος χώρος αποδεσμεύεται αυτόματα όταν το αντικείμενο βρεθεί εκτός εμβέλειας. Η κλάση αυτή μπορεί να είναι τροποποιημένο εκχώρηση χρησιμοποιώντας το πρόγραμμα εκχώρησης OLE και δεν ελευθερώσετε το εκχώρηση χώρου για συμβολοσειρές που μεταβιβάζονται μέσω-out ή out- παράμετροι.

Μία από τις κλάσεις, String16, από το πλαίσιο Don στήλης η οποία μετατρέπει μια Συμβολοσειρά ANSI σε Unicode, ακολουθεί. Μια άλλη κλάση, String8 παρόμοια για αυτό χρησιμοποιείται για ANSI για μετατροπή Unicode. Το Κλήση του CreateFileMoniker από το προηγούμενο παράδειγμα μπορεί να γίνει ως εξής με αυτή την κλάση:
GetOpenFileName(&ofn);
CreateFileMoniker(String16(ofn.lpstrFile), &pmk);
				
Στον παραπάνω κώδικα, δημιουργείται μια παρουσία του String16. Η κατασκευή της κλάσης θα μετατρέψει τη συμβολοσειρά ANSI σε Unicode. Η γλώσσα εφαρμογή θα καλέσει τον τελεστή μετατροπής, τελεστής const wchar_t *, μετατροπή αυτής της παραμέτρου για τον τύπο του CreateFileMoniker του πρώτου η παράμετρος. Τελεστή μετατροπής θα επιστρέψει συμβολοσειράς Unicode, η οποία είναι διαβιβάστηκε CreateFileMoniker. Το αντικείμενο θα destruct σε goes out εμβέλεια.
// 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 - Τελευταία αναθεώρηση: Πέμπτη, 26 Μαΐου 2011 - Αναθεώρηση: 4.0
Λέξεις-κλειδιά: 
kbcode kbhowto kbprogramming kbmt KB138813 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:138813

Αποστολή σχολίων

 

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