Evitando ocultação de informações
Ocasionalmente, os programas ocultam deliberadamente ou inadvertidamente informações do mecanismo de marshaling de RPC. Alguns exemplos são os seguintes:
- Enviar uma estrutura de dados como um bloco de bytes não diferenciado
- Aproveitando o desempenho usando um efeito colateral de um método para canalizar dados adicionais pela transmissão
- Tentando disfarçar um identificador passando-o como um DWORD ou um ULONG
Essas técnicas são quase garantidas para introduzir problemas de compatibilidade mesmo antes de portar seu aplicativo para o Windows de 64 bits.
Em vez de enviar um contexto de servidor como um DWORD em uma chamada de procedimento remoto padrão, use um identificador de contexto para fornecer um identificador opaco para um contexto de servidor que é mantido em nome de um cliente. Os contextos são identificados por GUIDs definidos pelo tempo de execução do RPC quando um servidor cria um identificador de contexto para um cliente. Nenhum ponteiro é usado sobre o fio e a operação é completamente transparente entre limites de 32 ou 64 bits. Para obter mais informações sobre como usar identificadores de contexto, consulte Identificadores de contexto.
As interfaces DCOM não podem usar identificadores de contexto porque o COM fornece seu próprio gerenciamento de contexto. Em vez de criar um identificador de contexto, você pode passar um ponteiro de interface para o objeto COM. Em seguida, você pode chamar os métodos diretamente por meio do ponteiro da interface ou colocar o ponteiro dentro de outras chamadas. Para liberar o objeto de servidor, o cliente chama o método Release da interface por meio do ponteiro da interface.
Novamente, pode haver momentos em que você não pode alterar o design original do código que você está portando. Se não houver como evitar o envio de um ponteiro pela transmissão como um DWORD, você precisará implementar alguma forma de mapeamento do lado do servidor entre valores DWORD e ponteiros. Uma maneira de fazer isso é alterar os ponteiros no aplicativo do lado do cliente para tipos de precisão de ponteiro, como ULONG_PTR ou DWORD_PTR. Em seguida, use o atributo MIDL [call_as] para colocar os ponteiros na transmissão como valores DWORD . O wrapper do lado do cliente só precisa passar os argumentos. O wrapper do lado do servidor manipula o mapeamento entre ambos os tipos. De maneira semelhante, você pode usar o atributo [transmit_as] ou o atributo [represent_as] para converter seus dados em um formato compatível com versões anteriores para representação eletrônica.
Se a compatibilidade com conexão com versões anteriores não for um problema ou se o identificador não for usado para chamadas remotas e você tiver certeza de que chamadas remotas entre processos de 32 e 64 bits nunca ocorrerão, você poderá redefinir um argumento como um ULONG64. Se necessário, você pode modificar o aplicativo de 32 bits para passar um DWORD para o usuário. Como alternativa, você pode criar stubs separados de arquivos IDL separados para cada plataforma usando um DWORD no Windows de 32 bits e um ULONG64 no Windows de 64 bits.