chamadas de API do Windows Mobile - sucesso, mas o código de erro retorna GetLastWin32Error - eu deveria estar preocupado?

StackOverflow https://stackoverflow.com/questions/606048

Pergunta

Eu sou um novato para chamadas de PInvoke. Eu pesquisei isso, pois parece ser uma questão bastante simples, mas nenhuma alegria.

Estou fazendo chamadas muliple API do Windows Mobile em uma fila (para detectar se meu aplicativo já está em execução e, em seguida, re ativar-lo). Tudo funciona muito bem e dândi, mas eu queria colocar no login etc para os momentos em que ele não funciona OK.

Ao escrever este código eu descobri que eu vai ter códigos de erro, mesmo quando as minhas chamadas aparentemente retornar um resultado válido e o resultado válido é utilizado com sucesso por uma chamada subsequente (provando que é válida eu acho.)

por exemplo. Eu chamo CreateToolhelp32Snapshot que me dá de volta um identificador para um instantâneo dos processos actualmente em execução. Chamando immediatley Marshal.GetLatWin32Error depois devolve o erro 6, que aparentemente significa identificador inválido. Mas o valor retornado é usado com sucesso pelas chamadas subsequentes para outros métodos e todo o processo funciona. É definitivamente esta chamada particular, que conjuntos de erro 6 porque se você chamar Marshal.GetLatWin32Error pouco antes de a chamada retorna 0.

As chamadas para Process32First e Process32Next apresentar um comportamento semelhante ou seja, eles me dão processar informações feliz, mas às vezes conjunto de erro 6. I (acho) Eu sei que isto está acontecendo porque eu chamo Marshal.GetLatWin32Error immediatley antes e depois de cada chamada e às vezes é 0 antes e depois de seis. Atualmente estou sempre recebendo um bom resultado (seja um identificador que funciona com chamadas subsequentes ou um valor que lança a 1 se int ou verdadeiro se bool e informações processo copiado com sucesso em meu tampão).

Assim ..... eu deveria me importar? É tudo trabalho .... me importa o que erro é definido se eu voltar um resultado que é utilizado com sucesso pelo resto do processo? Meu instinto diz que sim eu faço, não é? De qualquer maneira, como eu realmente saber se está tudo bem se eu, aparentemente, obter um resultado de volta bem sucedida, mas um código de erro também é definido? Estou tendo pesadelos sobre a liberação de um sistema instável que não vai ser me dar útil informações do erro novamente ........

Atualização

Este é o resultado do meu código loggong para tentar ilustrar o que estou falando para todos os interessados. Em breve, o código verifica já em execução cópias de si mesmo, em seguida, para já em execução cópias do cliente e, em seguida, reativa cliente se ele foi encontrado.

Method name: CreateToolhelp32Snapshot, Result: 605618176, Pre-call error code: 0, Post-call error code: 6
Method name: Process32First, Result: True, Pre-call error code: 6, Post-call error code: 6               
Method name: Process32Next, Result: True, Pre-call error code: 6, Post-call error code: 6                
Method name: Process32Next, Result: True, Pre-call error code: 6, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                                                                            
Method name: Process32Next, Result: False, Pre-call error code: 0, Post-call error code: 18              
Method name: CloseToolhelp32Snapshot, Result: True, Pre-call error code: 18, Post-call error code: 6     
Method name: CreateToolhelp32Snapshot, Result: 605618176, Pre-call error code: 6, Post-call error code: 0
Method name: Process32First, Result: True, Pre-call error code: 0, Post-call error code: 0               
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                                                                      
Method name: Process32Next, Result: False, Pre-call error code: 0, Post-call error code: 18              
Method name: CloseToolhelp32Snapshot, Result: True, Pre-call error code: 18, Post-call error code: 0     
Method name: ShowWindow, Result: True, Pre-call error code: 0, Post-call error code: 120                 
Method name: SetForegroundWindow, Result: True, Pre-call error code: 120, Post-call error code: 6        

Os resultados são sempre verdadeiras, exceto para os últimos chamadas para Process32Next para o qual falha com código 18 indica a última entrada foi alcançado. E eu só notei ShowWindow está resultando em erro 120 que não é suportado por isso vou ter que chamar.

Então, minhas duas questões reais são:

Por que os erros quando eu tenho um sucesso?
E, quando os erros pré-atendimento e pós-atendimento são os mesmos, como posso saber se este era o velho erro ou uma segunda ocorrência do mesmo erro?

Foi útil?

Solução

Você não deveria estar chamando GetLastWin32Error (GetLastError) a menos que CreateToolhelp32Snapshot retorna INVALID_HANDLE_VALUE.

http://msdn.microsoft.com/en-us/library/ms682489 ( VS.85) .aspx

Outras dicas

Você espera GetLastError () para retornar 0 após cada chamada bem-sucedida de qualquer função. Mas isso implica que essas funções chamar SetLastError (0) em seu epílogo que nem sempre é feito. É por isso que você não pode distinguir entre um código de erro antigo e um novo. Apenas chamar GetLastError () para casos MSDN diz-lhe para fazê-lo.

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