Dove viene documentato l'utilizzo di BSTR null?
-
06-07-2019 - |
Domanda
È almeno pratica comune trattare il BSTR null (null WCHAR * pointer) come una stringa vuota e progettare tutto il codice che manipola i BSTR di conseguenza. Risposte a questa domanda dire lo stesso.
Dove è documentata questa pratica? Esiste un documento ufficiale che descriva questa convenzione?
Soluzione
Bene, il link indicato nella risposta accettata a quella domanda è un articolo di Eric Lippert, La guida completa di Eric alla semantica BSTR . Sebbene sicuramente non sia una documentazione ufficiale, Lippert è un'autorità ben nota su COM (in particolare nell'arena degli script).
Tuttavia, la documentazione ufficiale dice questo:
Un BSTR senza elementi di dati è un BSTR vuoto o un BSTR NULL. Un BSTR vuoto indica un valore di dati presente, ma di lunghezza zero. Un BSTR NULL indica un valore di dati che non è presente.
Quindi, ufficialmente sono entrambi BSTR
senza elementi di dati, ma con semantica leggermente diversa (anche se non c'è nulla da dire che questi 2 casi debbano essere gestiti in modo diverso nella tua applicazione). In questo caso, seguirò sicuramente il consiglio di Lippert di trattarli in modo identico. Per me, la sua esperienza nel mondo reale su come funzionano le implementazioni effettive ha più peso dell'unica frase nel documento BSTR ufficiale.
Altri suggerimenti
Michael Burr dà quella che penso dovrebbe essere la risposta accettata. È un peccato che la pagina per BSTR
in MSDN non documenta questa pratica.
Inoltre, è possibile dedurre questo comportamento da queste pagine nella documentazione MSDN:
-
La pagina
-
SysFreeString
riporta che sebstr
ènull
la funzione ritorna semplicemente.
La pagina -
SysStringLen
riporta che passare unnull
per il parametrobstr
restituisce zero per la lunghezza della stringa.
La pagina -
SysStringByteLen
riporta stesso comportamento;null
significa lunghezza zero.
Tuttavia, la documentazione non è completa:
-
SysReAllocString
non menziona cosa succederà se* pbstr
ènull
. -
SysReAllocStringLen
non menziona cosa succederà se* pbstr
ènull
.
La gestione di BSTR null come cuciture stringhe vuote è una pratica comune, ma la documentazione tecnica trovata in Microsoft afferma in realtà che c'è una differenza tra quei due.
Per qualsiasi documento che fa riferimento sia a [MS-DTYP] che a [MS-OAUT], specificando BSTR in un contesto di rappresentazione del filo DEVE essere considerato come a riferimento al tipo di BSTR trasmesso, specificando BSTR in a il contesto di rappresentazione della memoria DEVE essere considerato come un riferimento a presentato tipo BSTR ([MS-DTYP] sezione 2.2.5). Riflettendo il terminologia utilizzata per BSTR presentati, un BSTR NULL o trasmessi NULL BSTR, è definito come la rappresentazione filo di un BSTR presentato NULL; e un BSTR vuoto, o BSTR trasmesso vuoto, è definito come il filo rappresentazione di un BSTR di lunghezza zero presentato. Conservazione di questo la distinzione nella rappresentazione wire consente a client e server di farlo distinguere tra i BSTR presentati da NULL e quelli a lunghezza zero presentati BSTR, e quindi associano eventualmente diversi, specifici dell'applicazione semantica di questi due valori.
https://msdn.microsoft.com/en-us/library /cc237580.aspx
Quindi dipende dalle implementazioni se gestiscono entrambe uguali o meno.