Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование своего типа файла

55K
18 марта 2010 года
u.nu
16 / / 18.03.2010
Создал свою прогу которая добавляет в ListBox пункт(ы) с полным именем файла.
Зарегил свой тип файла в системе:
----------------------------------------------------
[HKEY_CLASSES_ROOT\.my]
@="myfile"

[HKEY_CLASSES_ROOT\myfile]
@="Мой тип файла"

[HKEY_CLASSES_ROOT\myfile\DefaultIcon]
@="C:\\Program Files\\MyProgram\\mylib.dll,1"

[HKEY_CLASSES_ROOT\myfile\shell\open\command]
@="C:\\Program Files\\MyProgram\\MyProgram.exe %1"
----------------------------------------------------
Установил MyProgram.exe.
В Explorer-е открываю каталог с файлами *.my, выделяю несколько и нажимаю [ENTER]. (С OpenFileDialog-ом проблем нет.)
Запускается сразу несколько MyProgram.exe и у каждой в ListBox-е по файлу (*.my).
А мне нужен список, в одном-единственном экземпляре программы.

Кто знает подскажите как при открытии нескольких файлов одновременно, передавать аргументы одной программе и не создавать несколько процессов MyProgram.exe. (если можно на С#)
Или быть может с реестром я чего-то не сделал?
7
18 марта 2010 года
@pixo $oft
3.4K / / 20.09.2006
Ды всё у вас верно врод ебы…Попробуйте выделить несколько файлов .txt и нажать Enter–тот же самый эффект получите.Здесь надо по-другому делать:приложение при запуске определяет,не запущено ли оно уже.Если запущено,то той копии передаётся команда на открытие ещё одного файла.Как-то так
В C# межпроцессное взаимодействие должно быть очень хорошо налажено,поэтому поисковик вам в руки и удачи
253
18 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Хочу воспользоваться случаем и уточнить одну вещь.
Цитата:
Если запущено, то той копии передаётся команда на открытие ещё одного файла. Как-то так


У меня недавно была такая задача: определить, запущено ли приложение, и, если да, передать ему строку. С первым я справился (дело тривиальное), со вторым наполовину - найти HWND окна и послать ему сообщение дело не хитрое, что и работало, однако проблема возникла с передачей ему строки.

Так как строка передаётся из другого процесса, то память одного не видна из другого. Соответственно, надо как-то allocate'ить память под строку в другом процессе. Думается мне, делается это через VirtualAllocEx + WriteProcessMemory? Ну, а затем этот адрес передаётся вместе с посылаемым сообщением.

7
19 марта 2010 года
@pixo $oft
3.4K / / 20.09.2006
А средства межпроцессного взаимодействия не катят?Хотя бы те же pipes
253
19 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата: @pixo $oft
А средства межпроцессного взаимодействия не катят?Хотя бы те же pipes


Хм, про туннели я даже не подумал, не было нужды в таком взаимодействии раньше. Спасибо.
Оказывается, даже в википедии есть статья на эту тему...

55K
19 марта 2010 года
u.nu
16 / / 18.03.2010
Ну это типа клиент-сервер?
Спосибо @pixo $oft за подсказку!
Жаль препод в свое время не захотел разобрать эту тему. (блин, за что мы деньги платим:confused:)
Как вариант, этот лучший, из тех что я когда-либо использовал, хотя и не самый простой.
А если есть вариант попроще, буду просто сщастлив!
253
19 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата: u.nu
Ну это типа клиент-сервер?


Нет, всё проще будет. Вкратце, сначала ты определяешь, запущено ли твоё приложение или нет, если да, то:

  • либо ты выделяешь в запущенном процессе кусок памяти под имя файла (переданного через командную строку), копируешь его туда и посылаешь окну того приложения сообщение (send/postmessage) с указателем на скопированную тобой строку;
  • либо открываешь канал к этому процессу любым из способов, на которые мы тут намекнули (см. вики), и напрямую пишешь туда имя переданного файла. Похоже на простую работу с файлами (fgets/fputs).

Кстати, интересно, что будет, если этот паарметр задать не так:
 
Код:
@="C:\\Program Files\\MyProgram\\MyProgram.exe %1"

а так:
 
Код:
@="C:\\Program Files\\MyProgram\\MyProgram.exe %1 %2 %3 %4 %5 ... %9"

?
55K
20 марта 2010 года
u.nu
16 / / 18.03.2010
Цитата:
Кстати, интересно, что будет, если этот паарметр задать не так:
...

С заданием параметров..., не думаю что это удачный вариант, да и к тому же основное окно - MyProgram, должно быть единственным(но это не проблема), а те варианты что выше - возможно...
Спосибо Proger_XP, обязательно пересмотрю все твои варианты.
В общем я сделал так:
В IPC особо углублятся не стал(времени нет, клиент подгоняет...).
Схватил первый, который попался под руку пример с MSDN-v9, а им оказался - RemotingIPC и сделал релиз под свой софт.
Работает так:
Определившийся как первый(из процессов MyProgram) - сервер, остальные клиенты. Все отлично работает, без глюков и даже, я бы сказал - надежно.
Но опять же...
Мне пришлось установить связь через каналы, это - раз.
Обеспечить синхронизацию передачи данных, это - два.
В итоге накатал кучу всяких нагромождений, и все только для того, чтоб все тотже - MyProgram, грузил в себя то, с чем ассоциирован.
Оно ведь как бывает, чем сложнее код, тем труднее его контролировать.
Нет желания натыкатся на "подводные мины".
Вот я и говорю, геморно как то у меня получилось, нет той простоты которой хотелось бы.

253
20 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата: u.nu
С заданием параметров..., не думаю что это удачный вариант,


Почему? Задал один раз в реестре и (если это работает) получил ту простоту, о которой ты говоришь. Будет у тебя в командной строке передаваться 9 открытых файлов, например.

Цитата: u.nu

Мне пришлось установить связь через каналы, это - раз.
Обеспечить синхронизацию передачи данных, это - два.


Каналы - это то, о чём мы и говорили выше, когда упоминали IPC.

55K
20 марта 2010 года
u.nu
16 / / 18.03.2010
Не знаю что и сказать.
К примеру никак не работает при таком коде: [ATTACH]4115[/ATTACH]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог