Access Violation

terça-feira, janeiro 31, 2006

Oque esta errado com este código (Parte III) : Resposta
Este programa apresenta dois erros comuns relacionados ao desenvolvimento de clientes de componentes COM (é isso ai Daniel, você encontrou os dois!):
  • Utilizar smart pointers no mesmo escopo em que se chama CoInitialize() e CoUninitialize().

  • Tratamento incorreto quando os métodos selectNodes() / selectSingleNode() não retorna nenhum item.
O primeiro problema esta relacionado com o fato de que a chamada a CoUninitialize() será realizada antes do destrutor da classe CComPtr (devido ao
escopo da variável).

Quando o destrutor da classe for executado o método Release() da interface será executado resultando provavelmente em uma exceção (Access Violation).


Como solucionar este problema? Simples, basta declarar a variável em um bloco interno de forma que o mesmo tenha um escopo que termine antes do
escopo da função main().

O segundo problema é que os métodos selectSingleNode() e selectNodes() retornam S_FALSE caso o XPath passado não selecione nenhum nó, ou seja, a expressão da linha 15 será availada como true mas o smart pointer item estará igual a NULL.

Adriano

[+/-] mostrar/esconder este post