Newsgroup: it.comp.programmare.win32
Titolo: Da BSTR a char*

Ciao a tutti,
la mia domanda č brevissima:
Come faccio a convertire una stringa BSTR in una stringa char*?
Esiste un'API, una macro?
Grazie, Andrea
--
Posted from 
www.pneusonline.it
 [195.31.179.99] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Esiste un'API, una macro?
L'API e` WideCharToMultiByte, ma e` molto complessa.
Se hai ATL, la macro BSTR2A e` MOLTO piu` semplice
da usare (serve anche USES_CONVERSION all'inizio
della funzione dove vuoi usare macro dell'ATL).
Alex

> la mia domanda è brevissima:


 nell'esempio)...
...e lo sai cosa succede se i byte sono 257 o piu`...?  Un
errore che, se non controllato, porta a usare successivamente
del 'garbage' rimasto in 'stringa': notevole, rischiosa
fragilita` del programma.
SysStringLen e` il modo migliore di determinare la lunghezza
in caratteri di una BSTR, ma *NON* ti dice quanti *byte*
sara` lunga la stringa multibyte risultante (se non sei del
tutto familiare con la specifica codepage usata, non puoi in
generale sapere quanti byte serviranno per codificare, come
multibyte, ogni singolo dato carattere Unicode in input).
Meglio usare la stessa WideCharToMultiByte, con il sesto
parametro pari a zero, per farsi dire di quanti byte avra`
bisogno per salvare il risultato; poi allocare dinamicamente
lo spazio necessario; poi richiamare l'API per fare la vera
e propria conversione.  Ma questo puo` dare prestazioni non
accettabili se "di solito" le stringhe sono piccole, quindi
puo` convenire PARTIRE con una certa ipotesi, controllare
il risultato (errore ERROR_INSUFFICIENT_BUFFER da GetLastError
se la WideCharToMultiByte stessa torna 0) per passare se
occorre alla strategia piu` generale.
Secondo me, e` complessa piu` che abbastanza!-)
Alex

Luc <TOGL...@nip1.it-TOGLI> wrote in message


> Non è complessa per niente, invece...


 size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count );
Non ti permette di controllare la codepage in uso, e il controllo
del locale di conseguenza porta piu` spesso che no a problemi seri.
Scusa, non per discutere la professionalita` di nessuno, ma si ha
quasi l'impressione che non abbiate sviluppato molto codice che,
ad esempio, debba entro lo stesso documento supportare codifiche
multibyte diverse, come ad esempio Coreano _E_ Giapponese in qualche
salsa (SJIS o EUC o peggio ancora).  Le nostre applicazioni in queste
condizioni ci si trovano regolarmente (ad esempio, siamo stati scelti
come fornitore ufficiale di software CAD per la Adidas anche perche`
il nostro supporto multilinguaggio *funziona bene*, cosa cruciale
per chi condivide abitualmente documenti CAD su di una intranet
veramente mondiale) visto che, ahime`, mentre /NT, /2000, e /CE
ti permettono di lavorare BENE in Unicode, /95 e /98 no, e c'e`
dunque una enorme "legacy" di documenti "sciagurati", da "trattare
con le molle" in termini di conversioni-di-codici.
Se di vendere in Giappone e/o in Corea e/o alla Adidas non vi
importa, buon per voi e vivete pure felici a colpi di "tombe e
gabinetti" (in-joke vecchio come il cucco sulla WCs - TOMBs:-),
ma se invece si deve affrontare seriamente il problema allora
WideCharToMultiByte e` un buon punto di partenza (sulle varie
piattaforme Windows).  Pero` non e` affatto semplice da usare
*BENE*, ed e` inutile, anzi controproduttivo, "nascondersi
dietro un dito" fingendo che lo sia.  Tutto qua...
Alex




Non ti permette di controllare la codepage in uso, e il controllo
