jumper77 Ответов: 1

Получение исключения отказано в доступе попытка получить полный путь к приложению


У меня есть Listview, который содержит список приложений, имеющих TCP-соединения. Я хочу иметь возможность извлечь значок приложения, чтобы добавить его в столбец Listview. Но для этого мне нужен полный путь к исполняемому файлу.

Проблема в том, что я получаю исключение для некоторых программ, но не для других. Я получаю исключения для процессов Idle и svchost. Для меня это имеет смысл. Я мог бы поймать это в ловушку в блоке try catch и использовать общий значок приложения.

Но я также получаю исключения для программ, которые я установил сам. Одна странная вещь, которую я действительно не понимаю, - это то, что одно из приложений, которые я установил, имеет несколько TCP-соединений. К некоторым я могу проложить путь, к другим-нет.

Надеюсь, кто-нибудь объяснит мне, что происходит. Я был бы вам очень признателен.
Вот код, который я использую:

Что я уже пробовал:

processName = GetProcessName(Info.PID)
Try
     Dim p As Process = Process.GetProcessById(Info.PID)
     Dim exePath As String = p.Modules(0).FileName
     Using writer As StreamWriter = New StreamWriter("Ok.txt", True)
          writer.WriteLine(processName & "path is: " & exePath)
     End Using

Catch ex As Exception
     Using writer As StreamWriter = New StreamWriter("error.txt", True)
          writer.WriteLine("Could not get path for process: " & processName)
     End Using
End Try

Richard MacCutchan

Мы не можем угадать, какие ошибки вы получаете или когда вы их получаете.

1 Ответов

Рейтинг:
0

OriginalGriff

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

Но то, что вы говорите, что это "отказано в доступе", подразумевает, в чем проблема: это то, где вы пишете файл. Поскольку вы не указываете путь, он идет в текущую папку: папку приложений , которая для приложений выпуска будет находиться в разделе "Программные файлы", и те, которые защищены от записи в целях безопасности. Этот вид кода работает в разработке, потому что структура папок различна: отладочные приложения запускаются из папки bin/debug и выпускаются из папки bin/release, ни одно из которых не имеет никаких ограничений на запись. Но при освобождении? Он терпит неудачу.

Вы можете посмотреть здесь: Где я должен хранить свои данные?[^]- код написан на C#, а не на VB, но это довольно очевидно.


jumper77

Спасибо за ответ. Но я думаю, что, возможно, не очень хорошо объяснился. Что касается исключения, то оно всегда одно и то же. доступ запрещен. Это единственное исключение. И если это произойдет, это всегда происходит на второй строке блока" Try".

У меня нет проблем с написанием файлов. Файлы записываются только для того, чтобы показать результаты попыток получить путь к рассматриваемому исполняемому файлу.

Я просто пытаюсь выяснить, "почему" я получаю исключение отказа в доступе. Я могу использовать блок try catch, чтобы решить, следует ли добавлять элемент в Listview.

OriginalGriff

Вы хотите сказать, что это происходит на этой линии:

Dim exePath As String = p. Modules(0). FileName

Странный.
Начните с того, что разорвите эту линию

Dim x = p. модули
Dim y = x(0)
Дим з = г.Именем
Dim exePath As String = z

И посмотрите, поможет ли это вам определить, какая часть неправильна.

jumper77

Спасибо за ответ. И да, исключение происходит в строке, которую вы сказали (p. Modules (0).Имя файла). Я попробовал ваше предложение кода, и я получаю исключение на "Dim x = p. Modules", если там будет исключение.

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

OriginalGriff

Если вы посмотрите документацию по свойству Modules:
https://msdn.microsoft.com/en-us/library/system.diagnostics.process.modules(v=против 110). aspx
он действительно говорит

Win98WinMe
Это свойство недоступно на этой платформе, если вы запустили процесс с ProcessStartInfo.UseShellExecute, установленным в true.

Я не знаю, применимо ли это также и к более поздним операционным системам (MS может быть немного неловкой в отношении обновления документации). Но я бы предположил, что вы также можете получить это, пытаясь получить доступ (скажем) к 64-битному процессу из 32-битного приложения или, возможно, получить доступ к системному процессу из пользовательского приложения.
Вы проверили, какие процессы выбрасывают исключение?