为什么这个C#代码不是类型安全的,为什么这个其他位使它类型安全?

时间:2011-10-03 19:37:20

标签: 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 个答案:

答案 0 :(得分:2)

调整我的评论作为答案......

我不知道是什么让修改版本类型安全,但它是一个更安全(不易出错)的调用。

可以使用midiOutOpen nulldwCallbackInstance调用dll函数MidiOpenFlags = MidiOpenFlags.CALLBACK_FUNCTION参数。如果dll函数没有检查null,那么它会引起一些干扰。

使用所采用的函数,导出midiOutOpen参数,因此没有危险。

我不知道SetLastError = true是什么,但我认为包装器可能检查了LastError并采取了适当的行动(抛出异常?)