Информация об изменениях

Сообщение Re[2]: C++/CLI утечка USER объектов от 26.05.2015 16:29

Изменено 26.05.2015 16:34 Pavel Dvorkin

Здравствуйте, fddima, Вы писали:

F>Я так понимаю, что DestroyWindows это тупо нативная функция.

F>Win32Exception зовет Marshal.GetLastWin32Error() который НЕ вызывает GetLastError(), но он всё равно какой-то магией у тебя там оказался.
F>А какой такой магией он у тебя там оказался?

Он может там оказаться

For PInvoke, the solution is two-fold:
1) Mark the relevant PInvoke signature with SetLastError=true. This makes the CLR call GetLastError immediately after it calls the target unmanaged API and save the result.
2) Call Marshal.GetLastWin32Error (in System.Runtime.InteropServices) to retrieve the value that the CLR saved.

http://blogs.msdn.com/b/adam_nathan/archive/2003/04/25/56643.aspx
Здравствуйте, fddima, Вы писали:

F>Я так понимаю, что DestroyWindows это тупо нативная функция.

F>Win32Exception зовет Marshal.GetLastWin32Error() который НЕ вызывает GetLastError(), но он всё равно какой-то магией у тебя там оказался.
F>А какой такой магией он у тебя там оказался?

Он может там оказаться

For PInvoke, the solution is two-fold:
1) Mark the relevant PInvoke signature with SetLastError=true. This makes the CLR call GetLastError immediately after it calls the target unmanaged API and save the result.
2) Call Marshal.GetLastWin32Error (in System.Runtime.InteropServices) to retrieve the value that the CLR saved.

http://blogs.msdn.com/b/adam_nathan/archive/2003/04/25/56643.aspx

Тут еще один момент есть, и в этом часто делают ошибку (и в примере ТС тоже). GetLastError можно вызывать, только если BOOL функция вернула FALSE. В противном случае ее вообще вызывать нельзя.

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

А автор вызыавает ее без проверки результата.