Как открыть новый документ в запущенном приложении, не открывая новый экземпляр приложения? - PullRequest
1 голос
/ 08 января 2009

У меня есть ситуация, которая частично освещалась другими ответами в SO, но я не могу найти полный ответ. Короче говоря, мы пытаемся использовать URL-адреса для наших конкретных типов данных, которые при двойном щелчке откроют наше приложение и загрузят эти наборы данных в это приложение. У нас эта часть работает.

(например, URL может выглядеть так: resource: //shaders/basic_shader.hlsl)

Мы хотели бы предотвратить открытие новых экземпляров приложения при двойном щелчке по новому URL. Например, допустим, у нас есть URL, который открывает шейдер в нашем редакторе шейдеров. При нажатии на этот ресурс URL, он откроет наш редактор шейдеров. При щелчке по новому URL-адресу шейдера мы хотели бы иметь возможность открыть шейдер в запущенном в данный момент приложении и открыть новый шейдер в новой вкладке нашего редактора.

Мы можем легко определить, запущен ли другой экземпляр нашего приложения. Проблема, которую мы не знаем, как ее легко решить, заключается в том, как указать текущему приложению открыть этот новый файл для редактирования. Это поведение очень похоже на Apple Finder.

В Unix вы можете эмулировать это поведение, если ваше приложение откроет какой-либо именованный канал, а затем новые приложения смогут проверить, активен ли этот канал, и затем отправить данные документа по каналу. Есть ли более стандартный способ Windows для достижения этого поведения?

Нам нужно решение C / C ++. Спасибо.

Ответы [ 5 ]

2 голосов
/ 08 января 2009

Именованная труба - лучший способ. Первый экземпляр вашего приложения открывает канал и прослушивает его (используйте PIPE_ACCESS_INBOUND как dwOpenMode, и тот же код также позволит вам обнаружить запущенные экземпляры) Все последующие экземпляры проверяют, что они не одиноки, отправляют аргумент командной строки в канал и завершают работу.

1 голос
/ 08 января 2009

Создайте именованный мьютекс, когда приложение запускается, как сказал Дэвид Грант, затем перед отображением пользовательского интерфейса для второго URL-адреса проверьте этот мьютекс, если он уже создан, затем просто выйдите, передав новый URL-адрес первому запущенному приложению интерфейс в приложении для установки URL и указания программной переадресации)

0 голосов
/ 08 января 2009

Я довольно хорошо это применил для своего приложения C ++ MFC, следуя учебному пособию Джозефа Ньюкомера здесь Он использует именованный мьютекс, который проверяется при запуске, и сообщение, отправленное уже запущенному приложению с новым ресурсом, который нужно открыть.

0 голосов
/ 08 января 2009

Вы можете получить именованный мьютекс при запуске и применить его таким образом.

0 голосов
/ 08 января 2009

Вы не можете избежать выполнения программы, связанной с URL-адресом.

Решения "windows" заключаются в том, чтобы отправить сообщение (через DDE в старые времена, но, может быть, сейчас есть что-то более "современное") в ранее запущенное приложение с URL-адресом, а затем выйти ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...