«SetupOpenInfFile» получает ошибку нарушения доступа в Delphi2010 - PullRequest
3 голосов
/ 13 февраля 2011

При использовании следующего кода строки в Delphi 2010 появляется ошибка «Нарушение прав доступа», но тот же код работает нормально в VC ++.

Код Delphi 2010 -

var
  hMyInf : HINF;
begin
hMyInf := SetupOpenInfFile('.\\DIGIMHID.INF','Mouse', INF_STYLE_WIN4,Nil);

Код VC ++:

hMyInf = SetupOpenInfFile(".\\DigimHID.inf", "Mouse", INF_STYLE_WIN4, NULL);

Пожалуйста, помогите мне решить эту проблему. Спасибо всем.

Ответы [ 2 ]

4 голосов
/ 13 февраля 2011

Вызовите LoadSetupAPI перед использованием любых методов в SetupAPI.pas

Редактировать , чтобы представить некоторую предысторию: как написано Дэвидом в его ответе и мной в моем комментарии, ошибка, вероятно, вызвана вызовом неинициализированного указателя метода. Для меня первым tip было сообщение об ошибке «Нарушение доступа»: если эквивалент нарушения прав доступа поступил из самой Windows, его назвали бы Runtime Error 216. Код очень прост, использует только константы и вызов метода. Константы не могут генерировать AV, поэтому ошибка должна исходить от самого метода или от вызова метода.

Поскольку предоставленное объявление Delphi показывало «тип функции», я подозревал, что SetupOpenInfFile на самом деле является указателем метода, а не import методом. Эти указатели должны быть как-то инициализированы. Выполняя поиск SetupAPI.pas (спасибо Google за предоставленную ссылку, потому что я не использую библиотеки JEDI), я быстро обнаружил, что она назначается с LoadSetupAPI. Моя первая мысль: не вызывается ли LoadSetupAPI из секции initialization? Это не так, поэтому его нужно вызывать из кода. Проблема решена.

2 голосов
/ 13 февраля 2011

Ваше имя файла неверно в версии Delphi.Вы не избежите \ в Delphi, ни один не подойдет.Но это не приведет к нарушению доступа.

Я предполагаю, что ваш вызов GetProcAddress не выполняется.Но это предположение.Я хотел бы видеть больше кода и полное сообщение об ошибке.

РЕДАКТИРОВАТЬ

Кажется, мы были на правильном пути.Ответ Cosmin решит проблему для вас.Альтернативой может быть переключение на неявное связывание путем удаления определения условия SETUPAPI_LINKONREQUEST в SetupApi.pas.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...