2011-06-21 19 views
5

¿Es simplemente la forma en que los bytes se combinan para "codificar" los datos?¿Cuál es la diferencia entre una cadena COM (BSTR) y una cadena .NET?

Tengo curiosidad porque me pregunto cómo un RCW toma automáticamente una cadena .NET y la transforma en COM BSTR. Supongo que solo forma un COM BSTR válido transformado de la cadena .NET.

Relacionado: ¿Podría construir mi propio BSTR válido utilizando un tipo de byte en .NET?

Respuesta

9

Los dos tipos de cadenas no están relacionadas en absoluto. Debe ocurrir una transformación para convertir un tipo a otro.

Un BSTR tiene una serie de convenciones que deben seguirse para incluir asignados a través de SysAllocString *, desasignado con SysFreeString, que tiene un prefijo de longitud y un terminador de dos caracteres nulos.

http://msdn.microsoft.com/en-us/library/ms221069.aspx

cadena A .Net es un tipo administrado que se asigna a través del montón administrado. Su tiempo de vida es administrado por el recolector de basura CLR.

para construir su propia BSTR, sería mucho mejor utilizar Marshal.StringToBSTR:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.stringtobstr.aspx

Si eso no es suficiente, se puede PInvoke SysAllocString buena:

http://msdn.microsoft.com/en-us/library/ms221458.aspx

+0

Gracias joncham . Muy útil. Supongo que me pregunto cuáles serían las diferencias si inspeccioné los bits y bytes. Ambos se almacenan en alguna parte. Ambos representan algo. ¿No son solo diferentes bits y bytes para representar lo mismo (una cadena de caracteres?) – richard

+2

Sí, todos los datos son solo bytes ;-). El problema es quién asigna/desasigna esos bytes y las convenciones utilizadas al diseñar esos bytes. Por ejemplo, al asignar un BSTR, en realidad no recupera un puntero al inicio de la memoria asignada. Su puntero tiene 4 bytes en el espacio asignado, ya que los primeros cuatro bytes almacenan la longitud de la cadena. – joncham

+0

@Richard DesLonde: sí, ambos son matrices de caracteres. Sin embargo, no puede usar ninguna cadena de caracteres como 'System.String', ya que cualquier constructor de' System.String' copiará la matriz de caracteres en otra ubicación de memoria. – codekaizen

Cuestiones relacionadas