Вызовы API Windows Mobile - успех, но GetLastWin32Error возвращает код ошибки - следует ли мне беспокоиться? - PullRequest
0 голосов
/ 03 марта 2009

Я новичок в PInvoke звонках. Я гуглил это, поскольку это кажется достаточно простым вопросом, но не радость.

Я выполняю несколько вызовов Windows Mobile API подряд (чтобы определить, запущено ли уже мое приложение, а затем повторно активировать его). Все работает хорошо и прекрасно, но я хотел бы включить ведение журнала и т. Д. Для случаев, когда это не работает, хорошо.

При написании этого кода я обнаружил, что получу коды ошибок, даже когда мои вызовы, по-видимому, возвращают действительный результат, и действительный результат успешно используется последующим вызовом (доказав, что он действителен, я думаю.)

например. Я вызываю CreateToolhelp32Snapshot, который возвращает мне дескриптор снимка запущенных в данный момент процессов. Вызов Marshal.GetLatWin32Error сразу после возврата ошибки 6, которая, по-видимому, означает «Неверный дескриптор». Но возвращаемое значение успешно используется последующими вызовами других методов, и весь процесс работает. Определенно именно этот вызов устанавливает ошибку 6, потому что если вы вызываете Marshal.GetLatWin32Error непосредственно перед вызовом, он возвращает 0.

Вызовы Process32First и Process32Next демонстрируют аналогичное поведение, то есть они дают мне информацию о процессе счастливо, но иногда устанавливают ошибку 6. Я (думаю) я знаю, что это происходит, потому что я вызываю Marshal.GetLatWin32Error немедленно до и после каждого вызова, а иногда 0 до и 6 после. В настоящее время я всегда получаю успешный результат (либо дескриптор, который работает с последующими вызовами, либо значение, равное 1, если int или true, если информация bool и процесса успешно скопирована в мой буфер).

Итак ... мне наплевать? Это все работает .... Мне все равно, какая ошибка устанавливается, если я получаю результат, который успешно используется остальной частью процесса? Мой кишечник говорит, что да, конечно? В любом случае, как мне узнать, все ли в порядке, если я, по-видимому, получаю успешный результат, но также установлен код ошибки? Мне снятся кошмары о выпуске нестабильной системы, которая не даст мне полезной информации об ошибках ........

UPDATE

Это результаты моего кода входа в систему, чтобы попытаться проиллюстрировать то, о чем я говорю, для всех, кто заинтересован. Вкратце, код проверяет уже запущенные копии самого себя, затем уже запущенные копии клиента и затем повторно активирует клиент, если он был найден.

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        

Результаты всегда верны, за исключением последних вызовов Process32Next, для которых ошибка с кодом 18 указывает на то, что была достигнута последняя запись. И я только что заметил, что ShowWindow приводит к ошибке 120, которая не поддерживается, поэтому я уберу этот вызов.

Итак, два моих актуальных вопроса:

Почему ошибки, когда я добился успеха?
И, если ошибки перед вызовом и после вызова совпадают, как я могу узнать, была ли это старая ошибка или повторение одной и той же ошибки?

Ответы [ 2 ]

2 голосов
/ 03 марта 2009

Не следует вызывать GetLastWin32Error (GetLastError), если CreateToolhelp32Snapshot не возвращает INVALID_HANDLE_VALUE.

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

1 голос
/ 03 марта 2009

Вы ожидаете, что GetLastError () будет возвращать 0 после каждого успешного вызова любой функции. Но это означает, что эти функции вызывают SetLastError (0) в своем эпилоге, что не всегда делается. Вот почему вы не можете отличить старый код ошибки от нового. Вызывайте GetLastError () только для случаев, когда MSDN говорит вам об этом.

...