Compartir a través de


Evitar ocultar información

En ocasiones, los programas ocultan deliberada o involuntariamente información del motor de serialización rpc. Algunos ejemplos son los siguientes:

  • Envío de una estructura de datos como un bloque de bytes no diferenciado
  • Aprovechamiento del rendimiento mediante un efecto secundario de un método para canalizar datos adicionales a través de la conexión
  • Intentar ocultar un identificador pasándolo como DWORD o ULONG

Estas técnicas están casi garantizadas para presentar problemas de compatibilidad incluso antes de migrar la aplicación a Windows de 64 bits.

En lugar de enviar un contexto de servidor como DWORD en una llamada a procedimiento remoto estándar, use un identificador de contexto para proporcionar un identificador opaco a un contexto de servidor que se mantiene en nombre de un cliente. Los contextos se identifican mediante GUID definidos por el tiempo de ejecución de RPC cuando un servidor crea un identificador de contexto para un cliente. No se usa ningún puntero sobre el cable y la operación es completamente transparente en límites de 32 o 64 bits. Para obtener más información sobre el uso de identificadores de contexto, vea Identificadores de contexto.

Las interfaces DCOM no pueden usar identificadores de contexto porque COM proporciona su propia administración de contexto. En lugar de crear un identificador de contexto, puede pasar un puntero de interfaz al objeto COM. A continuación, puede llamar a los métodos directamente a través del puntero de interfaz o colocar el puntero dentro de otras llamadas. Para liberar el objeto de servidor, el cliente llama al método Release de la interfaz a través del puntero de interfaz.

De nuevo, puede haber ocasiones en las que no se puede cambiar el diseño original del código que se va a migrar. Si no hay ninguna manera de evitar el envío de un puntero a través de la conexión como DWORD, tendrá que implementar alguna forma de asignación del lado servidor entre los valores DWORD y los punteros. Una manera de hacerlo es cambiar los punteros de la aplicación del lado cliente a tipos de precisión de puntero, como ULONG_PTR o DWORD_PTR. A continuación, use el atributo MIDL [call_as] para colocar los punteros en la conexión como valores DWORD . El contenedor del lado cliente solo necesita pasar los argumentos. El contenedor del lado servidor controla la asignación entre ambos tipos. De forma similar, puede usar el atributo [transmit_as] o el atributo [represent_as] para convertir los datos en un formato compatible con versiones anteriores para la representación de conexión.

Si la compatibilidad con conexiones anteriores no es un problema o si el identificador no se usa para las llamadas remotas y está seguro de que las llamadas remotas entre procesos de 32 y 64 bits nunca se producirán, puede redefinir un argumento como un ULONG64. Si es necesario, puede modificar la aplicación de 32 bits para pasar un DWORD al usuario. Como alternativa, puede crear códigos auxiliares independientes de archivos IDL independientes para cada plataforma mediante DWORD en Windows de 32 bits y un ULONG64 en Windows de 64 bits.