2014-09-08 4 views
0

Мне интересно, как отлаживать (или что делать на самом деле) отрицательное значение Marshal.GetLastWin32Error()?Отрицательный GetLastWin32Error()

У меня есть работа с компьютером на основе кода, внезапно он не работает на другом ПК, и я не знаю, что делать, потому что я не знаю, какие ошибки есть.

Вот код (существенная часть я думаю):

[DllImport("setupapi.dll", SetLastError = true)] 
static extern bool SetupDiChangeState(IntPtr deviceInfoSet, [In] ref SP_DEVINFO_DATA deviceInfoData); 

// and then somewhere 
if (!SetupDiChangeState(info, ref device)) 
    throw new Exception(string.Format("Error({0}) SetupDiChangeState", Marshal.GetLastWin32Error())); 

Исключения текст на другом ПК

Error (-536870389) SetupDiChangeState

Это не Добавлено here.

+1

'бесконтрольно ((UINT) Marshal.GetLastWin32Error())' является вашим другом здесь –

ответ

1

Ошибка (-536870389) SetupDiChangeState

Это 0xE000020B, и, возможно, соответствует ERROR_NO_SUCH_DEVINST.

Просмотреть DIFxAPI.h.

+0

Где я могу получить, что 'ERROR_NO_SUCH_DEVINST'? Я вижу, что можно преобразовать 'int' в hex:' 0xFFFFFFFFxxxxxxxx', правильно? – Sinatr

+1

Я бы сказал наоборот: отбросьте его на 'uint', а затем увидите шестнадцатеричное значение. – AlexD

+0

@Sinatr: Вы не можете * конвертировать * 'int' в hex. Hex - это позиционная система цифр, которая контролирует отображение ** **. С другой стороны, 'int' является типом данных вашего языка программирования C#. Тип данных контролирует, какие операции доступны, макет хранилища, диапазон и т. Д. Тип данных не связан с сохраненным значением в читаемом человеком представлении. – IInspectable

2

Если вы не хотите, чтобы ваша программа выдавала ошибку в шестнадцатеричном формате, вы также можете преобразовать код ошибки, используя calc.exe.

  • Сначала перейдите в режим программирования.

  • Выберите «Hex» и введите 100000000 (один и восемь нулей).

  • Вернитесь к «Dec» и вычтите абсолютное значение вашего кода ошибки, в данном случае 536870389.

  • Вернитесь к «шестнадцатеричному», чтобы увидеть шестнадцатеричный код ошибки, в данном случае E000020B.

+0

Спасибо, заметил, что после @AlexD ответ. Это еще проще, введите отрицательное значение там как «Dec», нажмите «Hex» и проигнорируйте часть «0xffffff» в начале. Запутанная часть - это то, почему 'Marshal' возвращает' int', другая запутанная часть - отсутствие нормальной ссылки msdn для всех кодов. В настоящее время я ищу их в google, введя «#define blabla», где blabla - это шестнадцатеричный код ошибки. Затем я знаю постоянное имя (например, 'SILENCE_MUST_BE_HEARED'), и только тогда я могу найти что-то, чтобы дать мне понять, что не так. Ввод '-536870389' в google - это сбой ... – Sinatr

 Смежные вопросы

  • Нет связанных вопросов^_^