Сведения о вопросе

Fedya

23:18, 10th August, 2020

Теги

Windows Vista: не удается загрузить DLL 'x.dll': недопустимый доступ к памяти. (DllNotFoundException)

Просмотров: 604   Ответов: 6

Сегодня днем я тестировал на коробке клиента, которая имеет Windows Vista (у него был дом, но я тестирую на бизнес-издании с теми же результатами).

Мы используем .DLL, который получает аппаратное обеспечение ID компьютера. Его использование очень просто, и образец программы, которую я создал, работает. Dll - это от AzSdk . На самом деле, это прекрасно работает под Windows XP. Однако, по какой-то странной причине, внутри нашего проекта (намного больше) мы получаем это исключение:

Exception Type:        System.DllNotFoundException
Exception Message:     Unable to load DLL 'HardwareID.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)
Exception Target Site: GetHardwareID

Я не знаю, что может быть причиной проблемы, так как у меня есть полный контроль над папкой. Проект представляет собой приложение форм c#.net Windows, и все работает нормально, за исключением вызова внешней библиотеки.

Я объявляю его следующим образом: (Примечание: это не библиотека COM, и ее не нужно регистрировать).

[DllImport("HardwareID.dll")]
public static extern String GetHardwareID(bool HDD,
   bool NIC, bool CPU, bool BIOS, string sRegistrationCode);

И тогда вызывающий код достаточно прост:

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = GetHardwareID(cb_HDD.Checked, 
                                  cb_NIC.Checked, 
                                  cb_CPU.Checked, 
                                  cb_BIOS.Checked, 
                                 "*Registration Code*");
}

Когда вы создаете пример приложения, он работает, но внутри моего проекта он не работает. Under XP работает нормально. Есть ли идеи о том, что я должен сделать в Vista, чтобы сделать эту работу? Как я уже сказал, папка и ее подпапки имеют полный контроль над "Everybody".

UPDATE: у меня не установлена Vista SP 1.

UPDATE 2: я установил Vista SP1 и теперь, когда UAC отключен, даже простой пример не работает!!! : (Чертова Виста.



  Сведения об ответе

KOMP

12:44, 25th August, 2020

Невозможно загрузить DLL 'HardwareID.dll': Недопустимый доступ к хранилищу памяти. (Исключение из HRESULT: 0x800703E6)

Имя DllNotFoundException сбивает вас с толку - это не проблема с поиском или загрузкой файла DLL, проблема в том, что при загрузке DLL он делает незаконный доступ к памяти, который приводит к сбою процесса загрузки.

Как и другой плакат Здесь, я думаю, что это проблема DEP, и что ваши изменения UAC и т.д., наконец, позволили Вам отключить DEP для этого приложения.


  Сведения об ответе

SSESION

17:09, 8th August, 2020

@ Мартин

Причина , по которой вы не получили приглашение UAC, заключается в том, что UAC может только изменить способ запуска процесса, после того как процесс запущен, он должен оставаться на том же уровне высоты. UAC подскажет, произойдет ли это, если:

  • Vista думает, что это установщик (здесь много правил , Самое простое - если он называется " setup.exe"),
  • Если он помечен как "Запуск от имени администратора" (вы можете изменить это, изменив свойства ярлыка или exe), или
  • Если exe содержит манифест, запрашивающий права администратора.

Первые два варианта-это обходные пути для 'legacy' приложений, которые существовали до UAC, правильный способ сделать это для новых приложений- внедрить ресурс манифеста , запрашивающий необходимые привилегии.

Некоторые программы, такие как Process Explorer , похоже, повышают уровень запущенного процесса (в этом случае вы выбираете "Show details for all process" в меню file), но на самом деле они запускают новый экземпляр, и именно этот новый экземпляр получает повышение, а не тот, который был первоначально запущен. Это рекомендуемый способ сделать это, если только некоторые части вашего приложения нуждаются в повышении уровня (например, специальный диалог 'admin options').


  Сведения об ответе

qwerty101

21:45, 27th August, 2020

Является ли машина, на которой вы развернули код, 64-разрядной машиной? Вы также можете столкнуться с проблемой DEP .

Редактировать

Это Macbook Pro 1-го поколения с процессором Intel Core Duo 2 1-го поколения. Далеко не 64 бита.

Я упомянул 64 бит, потому что на низких уровнях структуры от 32 бит до 64 бит не обрабатываются должным образом. Поскольку машины не являются 64-битными, то более чем вероятно отключение DEP будет хорошим логическим следующим шагом. Vista действительно стала более безопасной, чем XP SP2.

Ну, я только что выключил DEP глобально, но безрезультатно. Та же ошибка.

Ну, я также читал, что люди получали эту ошибку после обновления машины до Vista SP1. Есть ли у этих установок Vista пакет обновления 1 на них?

Оказывается, что-то совсем другое. Просто ради тестирования я отключил de UAC (примечание: Я не получал никаких подсказок).

Отлично, я вообще-то собирался предложить это, но решил, что ты, наверное, уже пробовал.


  Сведения об ответе

appple

00:54, 1st August, 2020

Вы обращались в службу поддержки к поставщику? Возможно, есть что-то в аппаратном обеспечении MacBook Pro, Что мешает продукту работать.


  Сведения об ответе

PROGA

16:00, 10th August, 2020

Учитывая, что исключение составляет DllNotFoundException, вы можете попробовать проверить HardwareID.dll с помощью Dependency Walker BEFORE, устанавливая любые средства разработки на установку Vista, чтобы увидеть, действительно ли отсутствует зависимость.


  Сведения об ответе

SSESION

22:12, 5th August, 2020

В дополнение к разрешению полного контроля над "Everyone" позволяет ли расположение также записывать процессы со средним уровнем целостности?

Как мне это проверить ? Я новичок в Vista, мне это не слишком нравится, это слишком медленно внутри VM для ежедневной работы и для использования VStudio внутри виртуальной машины, это не приносит ничего нового.

Из командной строки вы можете выполнить:

icacls C:\Folder

Если вы видите строку типа "обязательный Label\High обязательный уровень", то папка доступна только для процесса с высокой степенью целостности. Если такой строки нет, то процессы целостности среды могут получить к ней доступ при условии, что нет других ACLs, запрещающих доступ (например, на основе пользователя).

EDIT: забыл упомянуть, что вы можете использовать переключатель /setintegritylevel, чтобы фактически изменить необходимый уровень целостности для доступа к объекту.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться