Почему этот код C # не является типобезопасным и почему этот другой бит делает его безопасным для типов? - PullRequest
3 голосов
/ 03 октября 2011

Это из библиотеки 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 Ответ

2 голосов
/ 03 октября 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...