Я новичок в 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, которая не поддерживается, поэтому я уберу этот вызов.
Итак, два моих актуальных вопроса:
Почему ошибки, когда я добился успеха?
И, если ошибки перед вызовом и после вызова совпадают, как я могу узнать, была ли это старая ошибка или повторение одной и той же ошибки?