Как send to управляет входными аргументами? (Виндовс)

Фон: я хочу добавить свое приложение в контекстное меню Windows, я сделал это, добавив новый ключ в реестр Windows:

HKEY_CLASSES_ROOT\*\shell\myapp
HKEY_CLASSES_ROOT\*\shell\myapp\command

И присвоив значение по умолчанию клавиши «команда» местонахождению моего exe, а также дополнительный аргумент:

value = "c:\users\john\myapp\myappexe.exe" "%1" arg1

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

Я знаю, что это можно решить, создав расширения оболочки, как опубликовано здесь, здесь, здесь или здесь. Создание полнофункционального расширения оболочки выходит за рамки моего (небольшого) проекта, и я не нашел руководств, которые мог бы понять.

Проблема: я ищу способ обойти это и обнаружил, что программа, вызываемая из папки «отправить» в Windows, может обрабатывать несколько файлов, например, если я помещу исполняемый файл этого кода (С++) в C:\Users\john\AppData\Roaming\Microsoft\Windows\SendTo папка,

#include <iostream>
using namespace std;

int main(int argc, char* argv[]){
    for(int i=0;i<=argc;i++){
        cout << argv[i] << endl;
    }
    return 0;
}

...выделите кучу мух, и перетащите их в исполняемый файл, я получу в одном окне путь ко всем выбранным файлам (присылать на руководство). Как это работает? Могу ли я использовать это поведение и применить его к своему приложению?


person user3787097    schedule 19.08.2014    source источник


Ответы (1)


Один из подходов заключается в разработке вашего приложения таким образом, чтобы любой вновь запущенный экземпляр проверял наличие уже существующего экземпляра (для этого можно использовать мьютекс), а затем перенаправлял параметры командной строки этому экземпляру, инкапсулированные в сообщение некоторого вида. Затем исходный экземпляр может предпринять соответствующие действия.

person equin0x80    schedule 13.11.2019