Windows Vista: невозможно загрузить DLL «x.dll»: неверный доступ к памяти. (DllNotFoundException) - PullRequest
4 голосов
/ 27 августа 2008

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

Мы используем .DLL, который получает аппаратный идентификатор компьютера. Его использование очень простое, и созданный мной пример программы работает. 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 Forms, и все работает нормально, кроме вызова внешней библиотеки.

Я объявляю это следующим образом: (примечание: не библиотека 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*");
}

Когда вы создаете пример приложения, оно работает, а внутри моего проекта - нет. Под ХР работает нормально. Любые идеи о том, что я должен делать в Vista, чтобы это работало? Как я уже сказал, папка и ее подпапки имеют полный доступ для «всех».

ОБНОВЛЕНИЕ: У меня не установлена ​​Vista SP 1.

ОБНОВЛЕНИЕ 2: Я установил Vista SP1 и теперь, с отключенным UAC, не работает даже простой пример !!! :( Блин Виста.

Ответы [ 6 ]

4 голосов
/ 27 августа 2008

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

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

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

2 голосов
/ 27 августа 2008

@ Мартин

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

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

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

Некоторые программы, такие как Process Explorer , по-видимому, повышают уровень запущенного процесса (когда в этом случае вы выбираете «Показать детали для всего процесса» в меню файлов), но на самом деле они запускают экземпляр, и это тот новый экземпляр, который повышен, а не тот, который был первоначально запущен. Это рекомендуемый способ сделать это, если только некоторые части вашего приложения требуют повышения (например, специальный диалог «Параметры администратора»).

1 голос
/ 27 августа 2008

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

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

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

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

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

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

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

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

0 голосов
/ 27 августа 2008

В дополнение к предоставлению полного контроля «каждому», местоположение также позволяет процессам со средним уровнем целостности писать?

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

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

icacls C:\Folder

Если вы видите строку, такую ​​как «Обязательная метка \ Высокий обязательный уровень», то папка доступна только для процесса с высокой степенью целостности. Если такой линии нет, процессы средней целостности могут получить к ней доступ при условии, что нет других списков ACL, запрещающих доступ (например, на основе пользователя).

РЕДАКТИРОВАТЬ: забыл упомянуть, что вы можете использовать ключ / setintegritylevel, чтобы фактически изменить требуемый уровень целостности для доступа к объекту.

0 голосов
/ 27 августа 2008

Учитывая, что это исключение DllNotFoundException, вы можете попробовать проверить HardwareID.dll с помощью Dependency Walker ПЕРЕД установкой каких-либо инструментов dev на установку Vista, чтобы увидеть, действительно ли отсутствует зависимость.

0 голосов
/ 27 августа 2008

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

...