#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
и действовать соответствующим образом (исключение исключения?)