Использование своего типа файла
Зарегил свой тип файла в системе:
----------------------------------------------------
[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. (если можно на С#)
Или быть может с реестром я чего-то не сделал?
В C# межпроцессное взаимодействие должно быть очень хорошо налажено,поэтому поисковик вам в руки и удачи
У меня недавно была такая задача: определить, запущено ли приложение, и, если да, передать ему строку. С первым я справился (дело тривиальное), со вторым наполовину - найти HWND окна и послать ему сообщение дело не хитрое, что и работало, однако проблема возникла с передачей ему строки.
Так как строка передаётся из другого процесса, то память одного не видна из другого. Соответственно, надо как-то allocate'ить память под строку в другом процессе. Думается мне, делается это через VirtualAllocEx + WriteProcessMemory? Ну, а затем этот адрес передаётся вместе с посылаемым сообщением.
Хм, про туннели я даже не подумал, не было нужды в таком взаимодействии раньше. Спасибо.
Оказывается, даже в википедии есть статья на эту тему...
Спосибо @pixo $oft за подсказку!
Жаль препод в свое время не захотел разобрать эту тему. (блин, за что мы деньги платим:confused:)
Как вариант, этот лучший, из тех что я когда-либо использовал, хотя и не самый простой.
А если есть вариант попроще, буду просто сщастлив!
Нет, всё проще будет. Вкратце, сначала ты определяешь, запущено ли твоё приложение или нет, если да, то:
- либо ты выделяешь в запущенном процессе кусок памяти под имя файла (переданного через командную строку), копируешь его туда и посылаешь окну того приложения сообщение (send/postmessage) с указателем на скопированную тобой строку;
- либо открываешь канал к этому процессу любым из способов, на которые мы тут намекнули (см. вики), и напрямую пишешь туда имя переданного файла. Похоже на простую работу с файлами (fgets/fputs).
Кстати, интересно, что будет, если этот паарметр задать не так:
а так:
?
...
С заданием параметров..., не думаю что это удачный вариант, да и к тому же основное окно - MyProgram, должно быть единственным(но это не проблема), а те варианты что выше - возможно...
Спосибо Proger_XP, обязательно пересмотрю все твои варианты.
В общем я сделал так:
В IPC особо углублятся не стал(времени нет, клиент подгоняет...).
Схватил первый, который попался под руку пример с MSDN-v9, а им оказался - RemotingIPC и сделал релиз под свой софт.
Работает так:
Определившийся как первый(из процессов MyProgram) - сервер, остальные клиенты. Все отлично работает, без глюков и даже, я бы сказал - надежно.
Но опять же...
Мне пришлось установить связь через каналы, это - раз.
Обеспечить синхронизацию передачи данных, это - два.
В итоге накатал кучу всяких нагромождений, и все только для того, чтоб все тотже - MyProgram, грузил в себя то, с чем ассоциирован.
Оно ведь как бывает, чем сложнее код, тем труднее его контролировать.
Нет желания натыкатся на "подводные мины".
Вот я и говорю, геморно как то у меня получилось, нет той простоты которой хотелось бы.
Почему? Задал один раз в реестре и (если это работает) получил ту простоту, о которой ты говоришь. Будет у тебя в командной строке передаваться 9 открытых файлов, например.
Мне пришлось установить связь через каналы, это - раз.
Обеспечить синхронизацию передачи данных, это - два.
Каналы - это то, о чём мы и говорили выше, когда упоминали IPC.
К примеру никак не работает при таком коде: [ATTACH]4115[/ATTACH]