Получить путь к файлу в ассоциированном приложении

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dvb
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 21.07.2008 (Пн) 14:54

Получить путь к файлу в ассоциированном приложении

Сообщение dvb » 21.07.2008 (Пн) 16:46

Создано расширение файлов для нового приложения.
Это расширение связано с приложением.
Теперь ассоциированные с приложением файлы запускают приложение, однако в приложении открывается файл, ранее открытый из приложения, а не посредством клика на значке файла (путь прописывается через CommonDialog).

Необходимо при запуске приложения через любой ассоциированный файл получить путь к этому файлу.
Подскажите, как это реализовать?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 21.07.2008 (Пн) 16:50

Путь к кликнутому файлу будет в Command$.
Лучший способ понять что-то самому — объяснить это другому.

dvb
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 21.07.2008 (Пн) 14:54

Сообщение dvb » 21.07.2008 (Пн) 17:07

Если не трудно - чуть по-подробнее, а то я пытался через этот command$ решить задачу, ан не получилось

dvb
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 21.07.2008 (Пн) 14:54

Сообщение dvb » 21.07.2008 (Пн) 18:23

...возвращается пустая строка. Пытался получить путь и в Form_Initialize, и в модуле в Sub Main - глухо!

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 21.07.2008 (Пн) 18:39

Немного не догнал в чём тема. Но может ты в реестре неправильно зарегал новый тип файла? Просто эксплорер будет посылать параметры коммандной строки только когда ты именно иконку файла ПЕРЕТАСКИВАЕШЬ на иконку программы. Иначе нужно ставить спецфлаг в реестре. Помнится где-то в каком-то строковом нужно было дописать "!", но где - не помню. Поищи по форуму, ибо я находил, когда свою оболочку кодил.
Follow the white rabbit.

dvb
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 21.07.2008 (Пн) 14:54

Сообщение dvb » 21.07.2008 (Пн) 19:20

Зарегал правильно, систему оповестил через SHChangeNotify, система распознаёт файлы и выдаёт соответствующую иконку, значок приложения появляется в "Открыть с помощью...". Только чтение данных из файла производится по имени этого файла (читай - пути)с использованием переменной strFileName.
:?:
Вопрос: как при запуске приложения (а-ля простенький редактор вроде Word, Excel, Access) в переменную прописать путь выбранного пользователем файла? Если файл открывается в приложении с помощью диалога "Открыть", тут всё понятно, присваиваем переменной значение CommDial.FileName, сохраняем его в .ini или в реестре, а вот если приложение ещё не запущено и пользователь кликает на самом файле, где и как приложению узнать путь (имя) к этому файлу???

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 21.07.2008 (Пн) 19:31

Ещё раз говорю. Если корректно зареган, то Command$ будет содержать путь к файлу, по которому в эксплорере даблкликнули. Если не содержит - значит зареган неверно, ибо тама ещё не всё ты сделал. Вот.
Follow the white rabbit.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 21.07.2008 (Пн) 21:29

В дефолтном значении ветки HKEY_CLASSES_ROOT\Твой.Класс\shell\open\command точно есть "%1%"?
Лучший способ понять что-то самому — объяснить это другому.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 21.07.2008 (Пн) 21:55

Во! Во! "%1%" точно!!!! А меня что-то на "!" заклинило.
Follow the white rabbit.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 22.07.2008 (Вт) 10:56

Второй % - лишний. Просто
"путь\мояпрограмма.exe" "%1"
label:
cli
jmp label

dvb
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 21.07.2008 (Пн) 14:54

Сообщение dvb » 22.07.2008 (Вт) 16:54

Добавлял в реестр по этой функции:

Код: Выделить всё
Sub AssExtension()

Dim sKeyName As String
Dim sKeyValue As String

Dim ret as Long
Dim lphKey as Long

'Создание раздела программы
sKeyName = "MyApp.1" ' Название приложения
sKeyValue = "My Application 1" ' Полное название, так же возможно краткое описание
ret = RegCreateKey(HKEY_CLASSES_ROOT, sKeyName, lphKey)
ret = RegSetValue(lphKey, "", REG_SZ, sKeyValue, 0&)


'Создание раздела, для использования иконки.
sKeyName = "MyApp.1\DefaultIcon" ' Название приложения
sKeyValue = "C:\Program Files\MyProgram\myprog.exe,0"  ' Путь к используемой иконке
ret = RegCreateKey(HKEY_CLASSES_ROOT, sKeyName, lphKey)
ret = RegSetValue(lphKey, "", REG_SZ, sKeyValue, 0&)


'Создание раздела, относящегося к расширению
sKeyName = ".myp" ' Регистрируемое расширение
sKeyValue = "MyApp.1" ' Приложение, с которым связываеться данное расширение
ret = RegCreateKey(HKEY_CLASSES_ROOT, sKeyName, lphKey)
ret = RegSetValue(lphKey, "", REG_SZ, sKeyValue, 0&)


'Коммандная линия для приложения"MyApp".
sKeyName = "MyApp.1"
sKeyValue = "C:\Program Files\MyProgram\myprog.exe %1"
ret = RegCreateKey(HKEY_CLASSES_ROOT, sKeyName, lphKey)
ret = RegSetValue(lphKey, "shell\open\command", REG_SZ, sKeyValue, MAX_PATH)

Call SHChangeNotify (SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0)

End Sub


В предпоследнем абзаце "Коммандная линия..." добавлен ключ с ".ехе %1".

Может, я где-то ещё пропустил такой ключ или неправильно использовал функцию command$?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 22.07.2008 (Вт) 17:39

Да вроде всё правильно. Только проверь, а создаются ли эти ключи?
Ты ж ret нигде не смотришь, чёрт его знает, как отрботали функции..
label:
cli
jmp label

dvb
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 21.07.2008 (Пн) 14:54

Сообщение dvb » 23.07.2008 (Ср) 16:35

Проверил... и нашёл где @ порылась:

Мой код передаёт строку в реестр без кавычек, а соммандная строка в этом случае возвращается в режиме DOS с с сокращёнными именами. У меня обработчик при ошибке обращения к файлу просто выходил из процедуры без комментов. В-общем, я добавил Chr(34) к экспортируемой в реестр строке и всё получилось, как надо

Код: Выделить всё
sKeyValue = Chr(34) & App.Path & "\" & App.Title & ".exe" & Chr(34) & " " & Chr(34) & "%1" & Chr(34)


Огромное спасибо всем, кто не позволил мне сойти с пути истинного, кто настоял и не дал отвернуться от использования функции command$(), дабы постичь результат созидания! Во как[/code]


Вернуться в Visual Basic 1–6

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

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

    TopList