В документации MSDN для EnumDisplayDevices указано, что передача NULL в качестве первого параметра функции возвращает информацию об адаптере(ах) дисплея на компьютере (передача строки возвращает информацию об устройстве с таким именем).
Различные примеры C#, которые я видел в сети, передают null в функцию следующим образом:
result = EnumDisplayDevices(null, devNum, ref dd, flags);
Однако, когда я передаю значение null в качестве первого параметра, я получаю исключение System.AccessViolationException с сообщением «Попытка чтения или записи защищенной памяти».
Если я заменяю null на любую случайную ненулевую строку (например, «hello»), то вызов функции завершается успешно (я просто не получаю никакой информации об устройстве, потому что не существует устройства с именем «hello»).
Так как же передать null в качестве первого параметра функции EnumDisplayDevices? (Мне нужно иметь возможность передавать имена при последующих вызовах функции)
Соответствующие фрагменты моего кода следуют:
[DllImport("user32.dll")]
static extern bool EnumDisplayDevices(
string lpDevice,
uint iDevNum,
ref DISPLAY_DEVICE lpDisplayDevice,
uint dwFlags
);
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAY_DEVICE
{
public int cb;
public string DeviceName;
public string DeviceString;
public int StateFlags;
public string DeviceID;
public string DeviceKey;
}
#region Public Interface
public ObservableCollection<DisplayDevice> LoadDisplayDevices()
{
ObservableCollection<DisplayDevice> displayDevices = new ObservableCollection<DisplayDevice>();
uint devNum = 0;
uint flags = 0;
bool result = false;
DISPLAY_DEVICE dd = new DISPLAY_DEVICE();
dd.cb = (int)Marshal.SizeOf(dd);
try
{
result = EnumDisplayDevices(null, devNum, ref dd, flags);
...
null
. Возможно, это связано с одним из других параметров. - person John Saunders   schedule 16.03.2015