2011-10-03 10 views
3

これは、MIDIドットネットhttp://code.google.com/p/midi-dot-net/ライブラリからです:このC#コードは型保護されていないのですが、なぜこの他のビットが型保証されていますか?

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コールタイプセーフにしますか? ...

を答えとして私のコメントを適応さ

+6

私はタイプセーフとしてそれを見ることはありませんが、それは安全ですMidiOpenFlags'は正しい値だけを持ちます。 –

答えて

2

私は改訂版のタイプが安全になるかわからないが、それはより安全(以下エラーが発生しやすい)の呼び出しです。

nulldwCallbackInstanceのdllファンクションmidiOutOpenMidiOpenFlags = MidiOpenFlags.CALLBACK_FUNCTIONと呼び出すことができます。 dll関数がnullをチェックしない場合は、何らかの妨害を引き起こします。

採用された機能により、midiOutOpenのパラメータは派生しないので危険です。

`ので、私はSetLastError = trueが何であるか知らないが、私はラッパーがLastErrorをチェックし、適切に行動したかもしれないと思うだろう(スロー例外?)

関連する問題