Dinesh Kumar Dora Ответов: 2

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


Здравствуйте Друзья,

Я преобразовал свой код VB6 в VB.net и из - за зависимостей от окружающей среды я должен придерживаться dotnet 2.0.

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

Вот код, который терпит неудачу и дает System.Io.exception: плохое имя файла или номер:

<pre lang="vb">
Dim objShell As Object
Dim strPath As String
Dim strDirectory As String
strPathInstall = "HKEY_LOCAL_MACHINE\SOFTWARE\ABC\InstallInfo\"
strDrive = "INSTALLDRIVE"
objShell = CreateObject("Wscript.Shell")
strDirectory = objShell.ReadRegistry(strPathInstall & strDrive)


То objShell.ReadRegistry заявление создает System.Io.Exception-неверное имя или номер файла, если запись реестра отсутствует на хост-компьютере и это приводит к сбою моего приложения. Если реестр присутствует, то он успешно извлекает значение, иначе выбрасывает исключение.

Я хочу обработать это исключение, я хочу, чтобы оно продолжалось до следующего оператора, если ему не удается найти элемент реестра в hostmachine или просто установить strDirectory = ""

Я не могу дать попробовать поймать на это заявление, потому что есть много этого readregistry инструкций в коде и его не хорошо, чтобы дать попробовать поймать, чтобы каждое утверждение readregistry.

есть ли какой-нибудь способ решить эту проблему? Пожалуйста, предложите.

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

Я попробовал подход dotnet, но в некоторых других сценариях подход dotnet не может быть реализован из-за существующей логики.

2 Ответов

Рейтинг:
2

Maciej Los

Документации MSDN здесь: Чтение из реестра и запись в него (Visual Basic) | Microsoft Docs[^] Он содержит информацию о безопасности:

Цитата:
Надежное Программирование

Реестр содержит ключи верхнего уровня, или корневые, которые используются для хранения данных. Например, HKEY_LOCAL_MACHINE корневой ключ используется для хранения настроек машинного уровня, используемых всеми пользователями, в то время как HKEY_CURRENT_USER используется для хранения данных, специфичных для конкретного пользователя.

Исключение могут вызвать следующие условия:

Имя ключа ничего не значит (ArgumentNullException).

Пользователь не имеет прав на чтение из разделов реестра (SecurityException).

Имя ключа превышает ограничение в 255 символов (ArgumentException).

.Объем системы безопасности

Для запуска этого процесса вашей сборке требуется уровень привилегий, предоставленный RegistryPermission класс. Если вы работаете в контексте частичного доверия, процесс может выдать исключение из-за недостаточных привилегий. Аналогично, пользователь должен иметь правильные списки ACL для создания или записи в настройки. Например, локальное приложение, имеющее разрешение безопасности доступа к коду, может не иметь разрешения операционной системы. Для получения дополнительной информации см. Основы Безопасности Доступа К Коду[^].


Примечание: даже если ваш код работает (или кажется, что работает), это не значит, что это 100% версия .net. Я бы рекомендовал написать ваше заявление с нуля. В процессе творения вы должны иметь в виду, что VB.NET это не VB. Различия вы найдете здесь: Сравнение Visual Basic и Visual Basic .NET - Википедия[^]

Примечание № 2 я бы не стал хранить информацию в реестре (если только это не необходимо). Есть много мест, где вы можете хранить данные приложений/пользователей. Пожалуйста смотрите: Где я должен хранить свои данные?[^]


Рейтинг:
1

Ralf Meier

Иногда Гугл помогает :
[^]
Может быть, вы попробуете вот так ...


Dinesh Kumar Dora

Спасибо за ответ. Как упоминалось ранее, я уже пробовал прямой подход dotnet для чтения реестра, но в этом устаревшем коде есть определенные области, где я не могу использовать прямой подход dotnet. Есть ли способ, которым я могу лучше справиться с существующей objShell.ReadRegistry? В настоящее время я думаю о том, чтобы поймать system.io.exceptions и использовать при возобновлении ошибок следующий контролируемый способ. Поскольку речь идет только о чтении реестра, ничего особенного, поэтому я думаю, что могу пропустить определенные ошибки в определенных местах.

Dave Kreskowiak

Не могу им воспользоваться .Чистые классы, чтобы сделать реестр? Почему ты так думаешь?

Ralf Meier

Если вы работаете с ними .Net вы всегда должны использовать его внутреннюю функциональность ...
Как вы уже видели, функциональность VBA не работает или работает неправильно ...

Maciej Los

5ed!

Ralf Meier

.. и еще раз спасибо за Ваш голос ... :)