Зачем нужен SetLastError=true, если есть код возврата?
От: iukpshl  
Дата: 25.06.08 09:16
Оценка:
Многие при объявлении функции WinAPI, добавляю атрибут SetLastError, например, такое объявление:
        [DllImport("NetApi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern int NetLocalGroupDelMembers(
            [MarshalAs(UnmanagedType.LPWStr)] string servername,
            [MarshalAs(UnmanagedType.LPWStr)] string groupname,
            int level,
            ref LOCALGROUP_MEMBERS_INFO_3 buf,
            int totalentries
            );

Вопрос: зачем нужен SetLastError (с последующим Marshal.GetLastWin32Error()), если есть код возврата самого WinAPI, из которого и так можно узнать результат операции?
Re: Зачем нужен SetLastError=true, если есть код возврата?
От: HowardLovekraft  
Дата: 25.06.08 09:30
Оценка:
Здравствуйте, iukpshl, Вы писали:

I>Вопрос: зачем нужен SetLastError

В этом примере не нужен.
Re[2]: Зачем нужен SetLastError=true, если есть код возврата
От: iukpshl  
Дата: 25.06.08 09:38
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

I>>Вопрос: зачем нужен SetLastError

HL>В этом примере не нужен.

Мне больше интересно другое, перефразирую вопрос: Код возврата WinAPI функции и Marshal.GetLastWin32Error() возвращают всегда одно и тоже?
Re[3]: Зачем нужен SetLastError=true, если есть код возврата
От: TK Лес кывт.рф
Дата: 25.06.08 10:30
Оценка:
Здравствуйте, iukpshl, Вы писали:

I>>>Вопрос: зачем нужен SetLastError


Для того, что например, CreateFile возвращает InvalidHandle в случае ошибки и для получения доп. информации необходимо делать вызов GetLastError(). Вызвать GetLastError руками не всегда возможно в MSDN на эту тему говорят:

The common language runtime can make internal calls to APIs that overwrite the operating system maintained GetLastError.


I>Мне больше интересно другое, перефразирую вопрос: Код возврата WinAPI функции и Marshal.GetLastWin32Error() возвращают всегда одно и тоже?


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