Pergunta

É, pelo menos, uma prática comum para BStr mimo nulo (null WCHAR * ponteiro) como uma cadeia vazia e desenhar todo BSTRs o código de manipulação em conformidade. Respostas a esta pergunta dizer o mesmo.

Onde está essa prática documentada? Existe algum documento oficial que descreve esta convenção?

Foi útil?

Solução

Bem, o link fornecido na resposta aceita a essa pergunta é um artigo de Eric Lippert, guia completo para BSTR Semântica de Eric . Enquanto que seria mais definitivamente não ser documentação oficial, Lippert é uma autoridade bem conhecida em COM (particularmente na arena scripting).

No entanto, a documentação oficial tem que dizer isto:

Um BStr sem elementos de dados é ou um BStr vazio ou um BStr NULL. Um BStr vazio indica um presente, mas de comprimento zero, o valor de dados. A NULL BSTR indica um valor de dados que não está presente.

Assim, oficialmente ambos são BSTRs sem elementos de dados, mas com uma semântica ligeiramente diferente (embora não há nada para dizer que esses 2 casos precisam ser tratados de forma diferente em sua aplicação). Neste caso, eu certamente seguir o conselho de tratá-los de forma idêntica do Lippert. Para mim, a sua experiência no mundo real com a forma como real implementações trabalho tem mais peso do que a frase no documento oficial BSTR.

Outras dicas

Michael Burr dá o que eu acho que deve ser a resposta aceita. É lamentável que a página para BSTR no MSDN não documentar essa prática.

Além disso, você pode inferir este comportamento dessas páginas na documentação MSDN:

  • SysFreeString relatórios de página que se bstr é null a função simplesmente retornos.
  • SysStringLen relatórios de página que passar um null para o parâmetro bstr retorna zero para o comprimento da corda.
  • SysStringByteLen página relata o mesmo comportamento; meios null comprimento zero.

No entanto, a documentação não está completa:

tratamento de NULL BSTR como um vazio costuras string a ser uma prática comum, mas a documentação técnica encontrada no Microsoft afirma realmente que há é a diferença entre os dois.

Para qualquer documento fazendo referência tanto [MS-DTYP] e [MS-OAUT], especificando BStr num contexto representação fio deve ser considerado como um referência ao tipo BStr transmitida, enquanto especificando BStr numa contexto representação de memória deve ser considerada como uma referência para o apresentada tipo BStr ([MS-DTYP] secção 2.2.5). refletindo a terminologia utilizada para BSTRs apresentados, um BStr NULL, ou NULL transmitida BStr, é definida como a representação de um fio NULL apresentada BStr; e um BStr vazio, ou esvaziar BStr transmitida, é definido como o fio representação de um de comprimento zero apresentada BStr. Preservar este distinção na representação fio permite que clientes e servidores distinguir entre NULL apresentada BSTRs e de comprimento zero apresentados BSTRs, e, de aplicação específica, portanto, associado possivelmente diferente semântica para esses dois valores.

https://msdn.microsoft.com/en-us/library /cc237580.aspx

Portanto, cabe às implementações de se lidar com ambos iguais ou não.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top