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?

È stato utile?

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 se bstr è null la funzione ritorna semplicemente.
  • La pagina
  • SysStringLen riporta che passare un null per il parametro bstr restituisce zero per la lunghezza della stringa.
  • La pagina
  • SysStringByteLen riporta stesso comportamento; null significa lunghezza zero.

Tuttavia, la documentazione non è completa:

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top