Russian Qt Forum
Ноябрь 23, 2024, 14:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Контекстное меню (Windows) - путь  (Прочитано 29230 раз)
AlphaGh0St
Гость
« : Ноябрь 20, 2012, 22:47 »

Всем привет!
Задумка в следующем: добавил новый пункт контекстного меню по этой http://habrahabr.ru/post/79443/ статье.
Нужно написать простенькую и консольную программку, которая будет запускаться через добавленный пункт контекстного меню.
При запуске программа должна определить, от куда произошёл её запуск, т.е., предположим, пользователь выбрал новый пункт контекстного меню в "C:\Users", программа должна определить этот путь.

Подскажите, как это можно сделать? Как определить путь в таком случае?
Благодарю.
Записан
mutineer
Гость
« Ответ #1 : Ноябрь 20, 2012, 23:25 »

QString QDir::currentPath () проверял?
Записан
AlphaGh0St
Гость
« Ответ #2 : Ноябрь 21, 2012, 00:10 »

Цитировать
QString QDir::currentPath ()
В таком случае будет получен путь, по которому находится сам исполняемый файл (exe'шник), а нужно узнать путь, от куда пользователь вызвал контекстное меню.

Например, exe'шник может находится в C:\Program Files\Some program\pr.exe
А пользователь вызвал контекстное меню из другой директории, например, D:\Some dir.

Программа при запуске должна определить этот путь, в данном примере - это "D:\Some dir".
Записан
mutineer
Гость
« Ответ #3 : Ноябрь 21, 2012, 00:36 »

Цитировать
QString QDir::currentPath ()
В таком случае будет получен путь, по которому находится сам исполняемый файл (exe'шник), а нужно узнать путь, от куда пользователь вызвал контекстное меню.

Например, exe'шник может находится в C:\Program Files\Some program\pr.exe
А пользователь вызвал контекстное меню из другой директории, например, D:\Some dir.

Программа при запуске должна определить этот путь, в данном примере - это "D:\Some dir".

Я понял что тебе нужно, но у меня нет возможности проверить что вернет currentPath при запуске из контекстного меню. currentPath возвращает не директорию с бинарником программы, а директорию, которая была текущей при запуске. А это не всегда одно и то же
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Ноябрь 21, 2012, 01:46 »

а в argv не сидит нужный путь?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
AlphaGh0St
Гость
« Ответ #5 : Ноябрь 21, 2012, 15:56 »

QString QDir::currentPath () проверял?
Да, это сработало.
Всем спасибо за помощь!
Записан
AlphaGh0St
Гость
« Ответ #6 : Ноябрь 21, 2012, 20:07 »

Чтобы не создавать ещё одну тему, спрошу здесь.
Суть этой (первой) программки в том, чтобы определять, от куда она была запущена через контекстное меню.
Программка определила путь, записала его (путь) в файл и завершилась, всё просто. Файл каждый раз открывается на перезапись.

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

Возможно, есть способы по лучше, подскажите, как лучше реализовать такой обмен данными?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Ноябрь 21, 2012, 20:36 »

При запуске программа должна определить, от куда произошёл её запуск, т.е., предположим, пользователь выбрал новый пункт контекстного меню в "C:\Users", программа должна определить этот путь.
Может я чего-то не понял. Ну вот напр пользователь сидит в консоли и ввел руками полный путь. Потом сменил текущий каталог и опять ввел полный путь. В чем тогда смысл Вашего определения? Получить текущий каталог - и что с того?

Вообще такого рода "системные" задачи (завязанные на специфику) - на мой взгляд пустая трата времени. Все уходит в познание/изучение той "специфики" - а толку чуть. Хотите потренироваться - я Вам дам задачку  Улыбающийся
Записан
Bepec
Гость
« Ответ #8 : Ноябрь 21, 2012, 21:16 »

AlphaGh0St напишите что вы хотите получить в конце. Вашу конечную цель опишите.

Возможно вам нужно что-то уже готовое и уже кем то реализованное?
Записан
AlphaGh0St
Гость
« Ответ #9 : Ноябрь 21, 2012, 21:54 »

Если "в двух словах", то нужно следующее: одна программа записывает в файл какую-либо строку, вторая программа (желательно, тут же) считывает эту строку из файла. Всё.
Проблема заключается в том, что вторая программа должна определить, был ли файл перезаписан, и если "да", то незамедлительно считать данные из файла.

Первое, что приходит в голову, это запустить дополнительный поток, который будет через определённый интервал времени (1 сек) проверять атрибуты файла (дату последней модификации). Если файл был перезаписан, скажем, более, чем 3 секунды назад, просигналить об этом.

Но, возможно, есть лучшее решение.
Тренировочных задач и готовых решений не надо, благодарю.
« Последнее редактирование: Ноябрь 21, 2012, 21:57 от AlphaGh0St » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Ноябрь 21, 2012, 22:06 »

Если "в двух словах", то нужно следующее: одна программа записывает в файл какую-либо строку, вторая программа (желательно, тут же) считывает эту строку из файла. Всё.
Проблема заключается в том, что вторая программа должна определить, был ли файл перезаписан, и если "да", то незамедлительно считать данные из файла.

Первое, что приходит в голову, это запустить дополнительный поток, который будет через определённый интервал времени (1 сек) проверять атрибуты файла (дату последней модификации). Если файл был перезаписан, скажем, более, чем 3 секунды назад, просигналить об этом.

Но, возможно, есть лучшее решение.
Это подходит под логику семафора. Напр приложение запущено и и ему надо отловить были ли еще попытки запуска того же приложения
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Ноябрь 21, 2012, 22:07 »

почему нельзя «сообщить» (через inter-process communication) другой программе эту строку напрямую, без всяких файлов? а другая программа просто сверит новые данные с текущими.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #12 : Ноябрь 21, 2012, 22:34 »

Вы не цель сообщили, а ту часть, про которую хотите спросить.

Цель у вас какая?

Взаимодействие между приложениями?  Работа с файлами? Отслеживание изменения файла? Клиент аськи? Операционная система?
Записан
AlphaGh0St
Гость
« Ответ #13 : Ноябрь 21, 2012, 22:57 »

почему нельзя «сообщить» (через inter-process communication) другой программе эту строку напрямую, без всяких файлов? а другая программа просто сверит новые данные с текущими.
Отличная идея!! Подскажите, как это сделать? Что можно почитать на эту тему? Программы под винду, обе на Qt.

Цель: программа копирования файлов.
Пользователь в нужном месте кликает ПКМ, в контекстном меню выбирает пункт типа "Установить флаг копирования".
Затем в саму программу копирования (в виде очереди) можно добавлять файлы и эти файлы будут копироваться туда, где установлен флаг.

Планировалось сделать так, в реестр был добавлен новый пункт контекстного меню (ссылка на статью в посте №1).
При выборе этого пункта меню, запускается маленькая консольная программа (только окно консоли не появляется), которая определяет путь и записывает его в файл.
Вторая программа (копирования) определяет, что файл был изменён, забирает от туда новый путь и ожидает файлы на очередь.

Идея с межпроцессорным взаимодействием мне нравится больше.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #14 : Ноябрь 21, 2012, 23:21 »

я в этом не силен, но по идее тебе нужен QLocalSocket или QProcess

а вообще, если цель этой консольной программы — лишь подсунуть правильный путь, то почему нельзя этот путь направлять сразу в основную программу из контекстного меню проводника?
« Последнее редактирование: Ноябрь 21, 2012, 23:41 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 23.