Почему этот код на C # не типобезопасен и почему этот другой бит делает его типобезопасным?

#c# #winapi

#c# #winapi

Вопрос:

Это из midi-dot-net http://code.google.com/p/midi-dot-net / библиотека:

 static class Win32API
{ ...

    #region Non-Typesafe Bindings

     // The bindings in this section are not typesafe, so we make them private
     // and provide typesafe variants    
     [DllImport("winmm.dll", SetLastError = true)]
     private static extern MMRESULT midiOutOpen(out HMIDIOUT lphmo, 
        UIntPtr uDeviceID, MidiOutProc dwCallback, UIntPtr dwCallbackInstance, 
        MidiOpenFlags dwFlags);

     ...

     /// <summary>
     /// Opens a MIDI output device.
     /// </summary>
     /// NOTE: This is adapted from the original Win32 function in order
     ///       to make it typesafe.
     ///
     /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711632(VS.85).aspx
     public static MMRESULT midiOutOpen(out HMIDIOUT lphmo,
        UIntPtr uDeviceID, MidiOutProc dwCallback, UIntPtr dwCallbackInstance)
     {
        return midiOutOpen(out lphmo, uDeviceID, dwCallback, dwCallbackInstance,
                  dwCallback == null ? MidiOpenFlags.CALLBACK_NULL :
                     MidiOpenFlags.CALLBACK_FUNCTION);
     }
  

Как эта последняя функция делает типобезопасным вызов win32?

Комментарии:

1. Я не считаю его безопасным для типов, но он безопаснее, потому MidiOpenFlags что будет иметь только правильное значение.

Ответ №1:

Адаптация моего комментария в качестве ответа…

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

Можно вызвать midiOutOpen параметр функции dll с null dwCallbackInstance помощью with MidiOpenFlags = MidiOpenFlags.CALLBACK_FUNCTION . Если функция dll не проверяет значение null, это вызовет некоторые помехи.

С помощью принятой функции midiOutOpen параметр выводится, поэтому опасности нет.

Я не знаю, что SetLastError = true это такое, но я бы подумал, что оболочка могла проверить LastError и действовать соответствующим образом (исключение исключения?)