vb.net и реестр, запуск и информация

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

vb.net и реестр, запуск и информация

Сообщение Invader » 25.11.2011 (Пт) 16:39

насколько полную информацию о любом файле можно получать из реестра? Его (расположение, тип - расширение,размер, уровни доступа, атрибуты) и возможное их изменение?
Последний раз редактировалось Invader 25.11.2011 (Пт) 18:11, всего редактировалось 1 раз.
умён и жаден,
характер отсуствует

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4389
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: vb.net и реестр, запуск и информация

Сообщение Viper » 25.11.2011 (Пт) 18:01

Ну и каша...
Весь мир матрица, а мы в нем потоки байтов!

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: vb.net и реестр, запуск и информация

Сообщение Invader » 25.11.2011 (Пт) 18:21

по пробую так поставить вопросы:


1. зная только имя файла с расширением, какую информацию можно получить обращаясь из vb.net к реестру.
а. Его (расположение, тип - расширение,размер, уровни доступа, атрибуты)
б. возможное их изменение?

2. как корректно, выгрузить-закрыть из уже запущенных трёх calc.exe, только запущенный второй?
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.11.2011 (Пт) 18:58

Invader писал(а):1. зная только имя файла с расширением, какую информацию можно получить обращаясь из vb.net к реестру.
а. Его (расположение, тип - расширение,размер, уровни доступа, атрибуты)
б. возможное их изменение?

Всё перечисленное хранится не в реестре.

Invader писал(а):2. как корректно, выгрузить-закрыть из уже запущенных трёх calc.exe, только запущенный второй?

Есть метод CloseMainWindow - это корректное завершение процесса (наверное, точнее, не всегда работает), и метод Kill для немедленного уничтожения процесса. Как выбрать - тебе виднее.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: vb.net и реестр, запуск и информация

Сообщение Invader » 25.11.2011 (Пт) 19:56

закрывал так
Код: Выделить всё
Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("calc")

                    For Each p As Process In pProcess
                        p.Kill()
                    Next
                End If

но закрывались все открытые!
Qwertiy писал(а):
Invader писал(а):1. зная только имя файла с расширением, какую информацию можно получить обращаясь из vb.net к реестру.
а. Его (расположение, тип - расширение,размер, уровни доступа, атрибуты)
б. возможное их изменение?

Всё перечисленное хранится не в реестре.

простите а где? :oops:
умён и жаден,
характер отсуствует

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: vb.net и реестр, запуск и информация

Сообщение FireFenix » 25.11.2011 (Пт) 20:03

Invader писал(а):закрывал так
Код: Выделить всё
Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("calc")

                    For Each p As Process In pProcess
                        p.Kill()
                    Next
                End If

но закрывались все открытые!

Как написал так и работает - получаешь списки всех процессов с именем calc.exe и все закрываются.
Для того чтобы узнать какой именное нужен, нужно значить отличительные параметры (Id или хендл или текст окна или др.), по ним делать выборку и закрывать.

Invader писал(а):
Qwertiy писал(а):
Invader писал(а):1. зная только имя файла с расширением, какую информацию можно получить обращаясь из vb.net к реестру.
а. Его (расположение, тип - расширение,размер, уровни доступа, атрибуты)
б. возможное их изменение?

Всё перечисленное хранится не в реестре.

простите а где? :oops:

Расположение, Имя + Расширение, Размер, Атрибуты доступа - Файловая система
Атрибуты специфические для данного типа и информация о данном типе - Внутри сигнатуры файла
Ассоциированная программа и дефолтный значёк - В реестре
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: vb.net и реестр, запуск и информация

Сообщение Invader » 25.11.2011 (Пт) 20:28

Спасибо, разъяснил.
а как обратиться к файловой системе?
скажем, мне нужен путь до блокнота - то есть я записываю в интпутбокс notepad.exe, а в текстбоксе отображаю значение путь.
похоже на поиск виндовс, но есть ли возможность написать свой.
и ли есть какой нить "текстовый" файл, где по запросу coreldraw, отыскать (если есть) строчка типа С:\ProgramFiles\Corel\

Зачем мне это надо: хочу написать со своим интерфейсом, скорее 3d, свой проводник к файлам
умён и жаден,
характер отсуствует

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: vb.net и реестр, запуск и информация

Сообщение FireFenix » 25.11.2011 (Пт) 22:15

Invader писал(а):а как обратиться к файловой системе?
скажем, мне нужен путь до блокнота - то есть я записываю в интпутбокс notepad.exe, а в текстбоксе отображаю значение путь.

100% верно для каждой программы нельзя найти путь.
Путь можно найти к открытому процессу или проверить стандартные места обитания той или иной программы. В данном случае в любой Windows системе по умолчанию notepad лежит в %WinDir%\notepad.exe

Invader писал(а):Зачем мне это надо: хочу написать со своим интерфейсом, скорее 3d, свой проводник к файлам

Проводник отображает файлы и их расположение, но никак не "сканирует" установленные программы на возможно работы с ними
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: vb.net и реестр, запуск и информация

Сообщение Invader » 25.11.2011 (Пт) 22:34

в смысле шел графическую оболочку
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.11.2011 (Пт) 23:29

Открытие файла System.Diagnostics.Process.Start(FileName).

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re:

Сообщение Invader » 26.11.2011 (Сб) 0:39

Qwertiy писал(а):Открытие файла System.Diagnostics.Process.Start(FileName).

спасибо но уже пользуюсь
повторюсь, если равновесное название окна, такое как калькулятор, а открыто их три
как закрыть второй, а первый и третий оставить?
как программно узнать хендл окна (с учетом, что имена заголовков совпадают)?
такой вариант:
Код: Выделить всё
Dim shapka As String = "Калькулятор"
        hWnd = FindWindowByCaption(0, shapka)

не вариант
умён и жаден,
характер отсуствует

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: vb.net и реестр, запуск и информация

Сообщение Joo » 26.11.2011 (Сб) 7:56

Invader писал(а):повторюсь, если равновесное название окна, такое как калькулятор, а открыто их три
как закрыть второй, а первый и третий оставить?

Для, не совсем нормального, вопроса, совсем ненормальный ответ )
Код: Выделить всё
        Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("calc")
        'Заносим все процессы калькулятора в словарь, где ключ - время старта
        Dim calcList As New Dictionary(Of Date, Process)
        For Each p As Process In pProcess
            calcList.Add(p.StartTime, p)
        Next
        'Если калькуляторов больше одного
        If (calcList.Count > 1) Then
            'Копируем ключи в массив для сортировки
            Dim keyList(calcList.Keys.Count - 1) As Date
            calcList.Keys.CopyTo(keyList, 0)
            'Сортируем по времени запуска
            Dim d As Date
            For i As Integer = 0 To keyList.Length - 2
                For j As Integer = i + 1 To keyList.Length - 1
                    If (keyList(j) < keyList(i)) Then
                        d = keyList(i)
                        keyList(i) = keyList(j)
                        keyList(j) = d
                    End If
                Next
            Next
            'Уничтожаем тот который был запущен вторым
            calcList(keyList(1)).Kill()
        End If
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.11.2011 (Сб) 11:26

Можно тупо посортить массив процессов по времени старта :)
Только вот в вопросе не сказано, что второй по времени запуска :)

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: vb.net и реестр, запуск и информация

Сообщение Joo » 26.11.2011 (Сб) 12:00

Qwertiy писал(а):Только вот в вопросе не сказано, что второй по времени запуска

:D ну можно без сортировки, и тупо второй попавшийся процесс прибить, или выбрать по другому критерию, нежели время старта. Вариантов масса ) только я например не представляю где такое может понадобиться.
Вопрос звучал так:
Invader писал(а):2. как корректно, выгрузить-закрыть из уже запущенных трёх calc.exe, только запущенный второй?

Я и предположил, что второй в порядке запуска.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.11.2011 (Сб) 13:14

Если нужен второй по времени, то это делается намного проще и красивее:
Код: Выделить всё
Module All

Public Sub Main()
  Dim Prc As Process = Process.GetProcessesByName("calc").OrderBy(Function(P As Process) P.StartTime).Skip(1).FirstOrDefault()
  If (Prc IsNot Nothing) Then Prc.CloseMainWindow()
End Sub

End Module

CloseMainWindow или Kill выбирается по необходимости.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: vb.net и реестр, запуск и информация

Сообщение Joo » 26.11.2011 (Сб) 14:41

Qwertiy писал(а):Если нужен второй по времени, то это делается намного проще и красивее:

Joo писал(а):Для, не совсем нормального, вопроса, совсем ненормальный ответ )


Я думаю вы слишком серьезно воспринимаете мой пример в посте :-)
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: vb.net и реестр, запуск и информация

Сообщение Invader » 26.11.2011 (Сб) 15:43

ребята спасибо, метить по времени идея понравилась, но надо до минимума упростить - уменьшить код
через эту прогу планирую запускать все программы установленные на компе.
калькулятор привел к примеру, это может быть и одновременное открытие нескольких мозил, вордов, пару корелов, блокнотов, но кто-то бы сказал, что у них окна отличаются названиями.
Вот я и привел пример где такого условия не будет.
умён и жаден,
характер отсуствует

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: vb.net и реестр, запуск и информация

Сообщение Invader » 26.11.2011 (Сб) 16:56

Qwertiy, и Joo СПАИБО но всё как выяснилось гораздо проще :idea:
помог FireFenix(как всегда рулит) и MSDN
вот мой код, я спешил, но идею выразил :idea:
Код: Выделить всё
Public Class Form1
    Dim calc As Process
    Public x(5) As Long
    Dim i As Long
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        calc = Process.Start("calc")
        i = i + 1
        x(i) = calc.Id
        TextBox1.Text = TextBox1.Text + ("Стартанул CALC Id = " + x(i).ToString + Chr(13) + Chr(10))


    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim aProcess As System.Diagnostics.Process
        aProcess = System.Diagnostics.Process.GetProcessById(x(2))
        aProcess.Kill()
    End Sub
End Class

ну и сам проект
запуск и смерть проги.zip
(78.34 Кб) Скачиваний: 63
умён и жаден,
характер отсуствует

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: vb.net и реестр, запуск и информация

Сообщение Joo » 26.11.2011 (Сб) 17:05

Invader писал(а):вот мой код, я спешил, но идею выразил

Хм... а если приложения будут порождать сами дубликаты себя? Например в браузерах есть фишка "Открыть ссылку в новом окне", тогда идентификатора порожденного процесса в вашем массиве не окажется )
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: vb.net и реестр, запуск и информация

Сообщение Invader » 26.11.2011 (Сб) 17:24

новые окна получают системой свои id. продолжаю искать решение...
если я вас правильно понял, то вы говорите о модальности - окна, внутри формы приложения.
я об этом уже думал, возможно надо будет использовать иной метод закрытия, возможно уже по хендлу дочернего окна...
так или иначе мне нужны минимальные строчки кода, и как то всё это выражать : закрытие открытие в отдельном модуле с вариантами условий закрытия. 8)
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.11.2011 (Сб) 22:56

Нет. Процессы могут сами порождать процессы. В таком случае айдишники последних не попадут в массив.
И всё-таки, почему Kill?

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: vb.net и реестр, запуск и информация

Сообщение Invader » 27.11.2011 (Вс) 0:35

ну Kill() не принципиально, хотя полагаю полностью выгрузить ексешник.
Вот уважаемый Qwertiy, возможно Ваша правда, с вордом ни ваш код ни мой не работает
висит один процесс, а открыто несколько окон, хотя x(i) продолжает исправно передавать ID окон, но не закрывает :(
но для ворда я использовал помнится другую конструкцию: с методом создания документа и последующего закрытия.
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.11.2011 (Вс) 0:47

Invader писал(а):с вордом ни ваш код ни мой не работает

Должен работать. Kill работает всегда. Вероятно, имя процесса задано неверно.
Id принадлежит процессу, а не окну.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: vb.net и реестр, запуск и информация

Сообщение Invader » 27.11.2011 (Вс) 1:11

Ок. процесс WINWORD Вашим не убивается если есть у Вас Ворд запустите и увидете
или вот вам Мой пример
я скрыл свою часть кода для закрытия оставил только вашу
а потом можете проверить мой вариант убрав( ' )
запуск и смерть проги.zip
(123.16 Кб) Скачиваний: 70
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.11.2011 (Вс) 1:18

У меня нет Word'а, но я понял, в чём дело. Как и с Проводником. Существует только один экземпляр процесса и все окна принадлежат ему. Если убить первый процесс, то исчезнут все окна.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: vb.net и реестр, запуск и информация

Сообщение Invader » 27.11.2011 (Вс) 1:20

значит окна убивать, пордон закрывать надо будет иначе
умён и жаден,
характер отсуствует


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList