Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Inita Faust
1 / 1 / 0
Регистрация: 11.05.2016
Сообщений: 12
1

Проверить и прописать в реестр данные об ассоциации файлов

20.05.2017, 18:37. Просмотров 532. Ответов 8

Доброго времени суток.
Столкнулся с проблемой :
Нужно при нажатии кнопки проверить и если это не так прописать в реестр данные об ассоциации файлов (я знаю список расширений которые нужно ассоциировать с определенной программой С:\MyProg\Prog.exe) То есть при установки моей программы на компьютер и нажатии кнопки, которая бы открывала файл используя дополнительную программу которая идет вместе с моей.

Соответственно решил что для выполнения этих действий потребуется использовать командную строку, после поисков по форуму выделил для себя 3 вещи которые мне в этом могут помочь :
C#
1
Process.Start("cmd.exe");
C#
1
System.Diagnostics.Process.Start
C#
1
RegistryKey
Но к сожалению не нашел ничего, что бы после запуска этой командной строки помогло бы мне с решением самой задачи.


Открытие файла :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
 
 
namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        string Path;
        int i;
        public Form1()
        {
            InitializeComponent();
            Path = System.Reflection.Assembly.GetExecutingAssembly().Location;
            MessageBox.Show(Path);
            for (i = Path.Length - 1 ; i > 0; i--)
            {
                if (Path.Substring(i,1)==@"\")
                {
                    Path = Path.Substring(0, i + 1);
                    break;
                }
            }
            MessageBox.Show(Path);
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            
            MyProcess myProcess = new MyProcess();
 
            myProcess.OpenApplication(Path);
 
        }
    }
 
 
 
    class MyProcess
    {
        
        public void OpenApplication(string Path)
        {
            
            Process.Start(Path + "Prog.exe");
        }
 
    }
 
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2017, 18:37
Ответы с готовыми решениями:

Прописать программу в автозагрузку в реестр
Доброго времени суток! Вопрос: как добавить программу в реестр, для...

Ассоциации типов файлов с приложениями
Здравствуйте. В общем, дело обстоит так: написал я прогу, к-ая...

Как правильно прописать бинарные данные?
Имеется значение реестра в HEX виде: Как в Visual Studio 2015 прописать...

Как прописать путь сохранения для всех файлов
а то у меня не сохраняютя допустим сохранения игр на диске С в мои документы а...

Ассоциации файлов и реестр
Всем привет! У меня тут вопрос возник связанный с безопасностью. Как сделать...

8
Inita Faust
1 / 1 / 0
Регистрация: 11.05.2016
Сообщений: 12
22.05.2017, 15:16  [ТС] 2
Неужто это так сложно?)
0
OwenGlendower
Супер-модератор
Эксперт .NET
9480 / 8289 / 3547
Регистрация: 17.03.2014
Сообщений: 16,504
Записей в блоге: 1
22.05.2017, 18:21 3
Inita Faust, там не только работа с реестром, но и еще работа с COM интерфейсам (важно для Windows 8, 10). Читай подробности в MSDN - Default Programs.
1
Inita Faust
1 / 1 / 0
Регистрация: 11.05.2016
Сообщений: 12
23.05.2017, 13:52  [ТС] 4
полезная ссылочка спасибо, буду разбираться. По теме сейчас разбираюсь в возможности bat файлом или reg файлом добавить запись в реестр через запуск этого файла. не знаю получиться или нет.

Будет примерно такого вида

Код
[HKEY_CLASSES_ROOT\.OBJ]
@="OBJ.DOC"

[HKEY_CLASSES_ROOT\OBJ.DOC]
@="3D модель"

[HKEY_CLASSES_ROOT\OBJ.DOC\CLSID]

[HKEY_CLASSES_ROOT\OBJ.DOC\DefaultIcon]
@="\"C:\\Program Files (x86)\\Grand\\GrandSmeta 5.0\\Client\\Gsmeta.exe\",1"

[HKEY_CLASSES_ROOT\OBJ.DOC\Shell]

[HKEY_CLASSES_ROOT\OBJ.DOC\Shell\Open]
@="&Открыть"

[HKEY_CLASSES_ROOT\OBJ.DOC\Shell\Open\Command]
@="\"C:\\Program Files (x86)\\Grand\\GrandSmeta 5.0\\Client\\Gsmeta.exe\" ,%1"
в файл name.reg запускать его при первом запуске и заполнять соответствующие значения в реестре. Если я зря трачу время прошу меня остановить =D
0
OwenGlendower
Супер-модератор
Эксперт .NET
9480 / 8289 / 3547
Регистрация: 17.03.2014
Сообщений: 16,504
Записей в блоге: 1
23.05.2017, 14:02 5
Inita Faust, bat файл здесь не нужен. Можно поместить reg файл в ресурсы, при необходимости распаковать его в папку для временных файлов и выполнять команду reg import file.reg с помощью Process.Start.
0
Inita Faust
1 / 1 / 0
Регистрация: 11.05.2016
Сообщений: 12
23.05.2017, 14:22  [ТС] 6
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Inita Faust, bat файл здесь не нужен. Можно поместить reg файл в ресурсы, при необходимости распаковать его в папку для временных файлов и выполнять команду reg import file.reg с помощью Process.Start.
Отлично, так и сделаю, спасибо за ответы)
0
Inita Faust
1 / 1 / 0
Регистрация: 11.05.2016
Сообщений: 12
23.05.2017, 15:32  [ТС] 7
в итоге получилось работать с реестром таким образом
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 string Path2 = "";
            Path2 = System.Reflection.Assembly.GetExecutingAssembly().Location;
            MessageBox.Show(Path2);
            for (i = Path2.Length - 1; i > 0; i--)
            {
                if (Path2.Substring(i, 1) == @"")
                {
                    Path2 = Path2.Substring(0, i + 1)+ "assoMLV.reg";
                    break;
                }
            }
 
 
 
            File.WriteAllText(Path2, @"Windows Registry Editor Version 5.00" + "\n");
            File.AppendAllText(Path2, @"[HKEY_CLASSES_ROOT\.OBJ]"+"\n");
            File.AppendAllText(Path2, @"@=""OBJ.DOC""" + "\n");
            File.AppendAllText(Path2, @"[HKEY_CLASSES_ROOT\OBJ.DOC]" + "\n");
            File.AppendAllText(Path2, @"@=""3D модель""" + "\n");
            File.AppendAllText(Path2, @"" + "\n");
            File.AppendAllText(Path2, @"[HKEY_CLASSES_ROOT\OBJ.DOC\CLSID]" + "\n");
            File.AppendAllText(Path2, @"" + "\n");
            File.AppendAllText(Path2, @"[HKEY_CLASSES_ROOT\OBJ.DOC\DefaultIcon]" + "\n");
            File.AppendAllText(Path2, @" @="""""+Path3+@""" ,%1""" + "\n");
            File.AppendAllText(Path2, @"" + "\n");
            File.AppendAllText(Path2, @"[HKEY_CLASSES_ROOT\OBJ.DOC\Shell]" + "\n");
            File.AppendAllText(Path2, @"" + "\n");
            File.AppendAllText(Path2, @"@=""&Открыть""" + "\n");
            File.AppendAllText(Path2, @"" + "\n");
            File.AppendAllText(Path2, @"[HKEY_CLASSES_ROOT\OBJ.DOC\Shell\Open\Command]" + "\n");
            File.AppendAllText(Path2, @" @=""""" + Path3 + @""" ,%1""" + "\n");
            
            Process.Start(Path2);
пока что еще разбираюсь в правильности введенных строк и корректности исполнения, но сам факт что после получения разрешения о записи в реестр созданный построчно файл assoMLV.reg создает разделы в реестре

Название: MF3jIIvFCNY.jpg
Просмотров: 15

Размер: 11.5 Кб

Осталось разобраться в правильности заполнения .reg файла
0
OwenGlendower
Супер-модератор
Эксперт .NET
9480 / 8289 / 3547
Регистрация: 17.03.2014
Сообщений: 16,504
Записей в блоге: 1
23.05.2017, 15:54 8
Inita Faust, 1) записывать в файл рядом с программой это плохая идея т.к. у пользователя может не быть прав на запись в каталог приложения. Лучше использовать временный файл.

2) Текст для reg файла лучше записать в виде одной @-строки. Так будет проще делать модификации. Заменяемую часть (путь к exe файлу) подставлять с помошью Replace

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
string regFilePath = Environment.ExpandEnviromentVariables("%TEMP%\assoMLV.reg");
 
string regFileText = @"Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.OBJ]
@=""OBJ.DOC""
[HKEY_CLASSES_ROOT\OBJ.DOC]
@=""3D модель""
 
[HKEY_CLASSES_ROOT\OBJ.DOC\CLSID]
 
[HKEY_CLASSES_ROOT\OBJ.DOC\DefaultIcon]
 @=""""$EXE_PATH$"" ,%1""
 
[HKEY_CLASSES_ROOT\OBJ.DOC\Shell]
 
@=""&Открыть""
 
[HKEY_CLASSES_ROOT\OBJ.DOC\Shell\Open\Command]
 @=""""$EXE_PATH$"" ,%1""
";
regFileText = regFileText.Replace("$EXE_PATH$", Path3);
 
File.WriteAllText(regFilePath, regFileText);
 
Process.Start(regFilePath).WaitForExit();
 
// Удаляем временный файл
File.Delete(regFilePath);
Цитата Сообщение от Inita Faust Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
string Path2 = "";
Path2 = System.Reflection.Assembly.GetExecutingAssembly().Location;
MessageBox.Show(Path2);
for (i = Path2.Length - 1; i > 0; i--)
{
    if (Path2.Substring(i, 1) == @"")
    {
        Path2 = Path2.Substring(0, i + 1)+ "assoMLV.reg";
        break;
    }
}
Не надо изобретать велосипед и запутывать самого себя. Правильнее использовать методы класса Path для конструирования пути
C#
1
2
string Path2 = System.Reflection.Assembly.GetExecutingAssembly().Location;
Path2 = Path.Combine(Path.GetDirectoryName(Path2), "assoMLV.reg");
0
Inita Faust
1 / 1 / 0
Регистрация: 11.05.2016
Сообщений: 12
23.05.2017, 19:17  [ТС] 9
да, спасибо, так и правда проще =)

В общем то сама суть вопроса решена, в реестр пишутся данные вот немного измененный вид
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
string regFileText = @"Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.OBJ]
@=""OBJ.DOC""
[HKEY_CLASSES_ROOT\OBJ.DOC]
@=""3D модель""
[HKEY_CLASSES_ROOT\OBJ.DOC\CLSID]
[HKEY_CLASSES_ROOT\OBJ.DOC\DefaultIcon]
@=""""$EXE_PATH$"" ,%1""
[HKEY_CLASSES_ROOT\OBJ.DOC\Shell]
@=""OPEN""
[HKEY_CLASSES_ROOT\OBJ.DOC\Shell\Openas\Command]
""a""=""""$EXE_PATH$""  ""%1""
""MRUList"" = ""a""
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.obj]
 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.obj\OpenWithList]
 
""a""=""Anim8or.exe""
""MRUList"" = ""a""
 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.obj\OpenWithProgids]
""obj"" = hex(0):
""OBJ.DOC"" = hex(0):
 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.obj\UserChoice]
""Hash""=""lfZre0y6wQU=""
""ProgId""=""Applications\\Anim8or.exe""
Вторая часть строки отвечает за запись собственно в раздел "по умолчанию" для чего нужны "привилегии" как их получить и прикрутить пока разбираюсь, остальное все работает если кому надо.

Добавлено через 8 минут
И сразу апдейт, ошибка возникала потому что я не мог "перезаписать данные". Удалил все созданные данные из второй части, запустил программу все заработало!
0
23.05.2017, 19:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2017, 19:17

Как на с ++ прописать в реестр програму
Мне нужно написать прогу которая добавляет в реестр другую прогу

Прописать программу в реестр(автозапуск)
как прописать программу в реестр? если можно,то код для подмены explorer.exe и...

delphi7 прописать в реестр автозагрузки
Нарушение правил форума пункт 5.7 Запрещено создание и распространение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru