Как мне создать свой собственный протокол URL? (например, так: //…) [закрыто]

212

Я видел:

  • http://www...
  • ftp://blah.blah...
  • file://blah.blah...
  • unreal://blah.blah...
  • mailto://blah.blah...

Что это за первый раздел, где вы видите http и тому подобное?

Могу ли я зарегистрироваться самостоятельно?

Майкл Бек
источник
5
Не уверен, что для этого нужны теги c # и .net, он шире.
Роб Хруска
Это честно. Я отметил это только потому, что мы планировали использовать C # для реализации чего-то подобного. Спасибо хоть. :-)
Майкл Бек
14
Правильное название - «схема» (см. RFC 2616 и 2396). Даже если многие схемы URL-адресов названы в честь протоколов, это не означает, что единственный способ получить доступ к ресурсу через протокол
Marek
Есть два типа протоколов, но я не знаю, какой термин использовать для их дифференциации. Протоколы «file» и «mailto» обрабатываются в клиенте. Протоколы "http" и "ftp" обрабатываются на сервере. Сначала меня смущали ответы на протоколы, обрабатываемые в браузере, когда я хочу что-то, что обрабатывается на сервере.
user34660

Ответы:

203

Часть с HTTP://, FTP://и т. Д. Называется схемами URI

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

HKEY_CLASSES_ROOT/
  your-protocol-name/
    (Default)    "URL:your-protocol-name Protocol"
    URL Protocol ""
    shell/
      open/
        command/
          (Default) PathToExecutable

Источники: https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml , http://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx

Джеймс Грегори
источник
19
А как насчет не-Windows ОС?
Bdoserror
9
"А как насчет не-Windows ОС?" Это зависит от приложения. Я думаю, что на самом деле это часто зависит от приложений в Windows (это не сделает все волшебным образом).
Calum
2
Определите все. Запись в реестре говорит Windows передать Uri с этим протоколом указанному приложению, все остальное должно обрабатываться самим приложением.
Джеймс Грегори
5
Сменный обработчик протокола, безусловно, лучший выбор.
8
(Default)здесь означает пустую строку. Не воспринимайте это буквально.
deerchao
56

Откройте блокнот и вставьте в него код ниже. Измените «YourApp» на имя вашего приложения. Сохраните его в YourApp.reg и выполните его, нажав на него в проводнике. Это оно! Ура! Эрвин Хаантес

REGEDIT4

[HKEY_CLASSES_ROOT\YourApp]
@="URL:YourApp Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\YourApp\DefaultIcon]
@="\"C:\\Program Files\\YourApp\\YourApp.exe\""

[HKEY_CLASSES_ROOT\YourApp\shell]

[HKEY_CLASSES_ROOT\YourApp\shell\open]

[HKEY_CLASSES_ROOT\YourApp\shell\open\command]
@="\"C:\\Program Files\\YourApp\\YourApp.exe\" \"%1\" \"%2\" \"%3\" \"%4\" \"%5\" \"%6\" \"%7\" \"%8\" \"%9\""
Codebeat
источник
2
как звонить из проводника, что такое url
imp
@imp, неуместно вызывать .reg файлы из (интернета) проводника. Вы можете использовать команду start для запуска reg-файла, например «start yourregfile.reg», но вы получите быстрое сообщение от os, чтобы обязательно добавить его в реестр. Для этого у пользователя должны быть права администратора.
Codebeat
На самом деле я задаю этот вопрос stackoverflow.com/questions/24265292/… .
бес
3
% 1% 2 и т. Д. В файле reg являются аргументом для вашего приложения. Так что если вы делаете YourApp.exe "ваш аргумент", так% 1 == "ваш аргумент"
Codebeat
1
имеет значение только% 1, нет возможности указать в URL% 2 и% 3 и т. д.
Trident D'Gao
39

Это отличается для каждого браузера, в IE и Windows вам нужно создать то, что они называют подключаемым обработчиком протокола.

Основные шаги заключаются в следующем:

  1. Реализовать интерфейс IInternetProtocol.
  2. Реализуйте интерфейс IInternetProtocolRoot.
  3. Реализуйте интерфейс IClassFactory.
  4. По желанию. Реализуйте интерфейс IInternetProtocolInfo. Поддержка протокола HTTP обеспечивается обработчиком транзакций.
  5. Если реализовано IInternetProtocolInfo, обеспечьте поддержку PARSE_SECURITY_URL и PARSE_SECURITY_DOMAIN, чтобы менеджер зон безопасности URL-адресов мог правильно обрабатывать безопасность. Напишите код для вашего обработчика протокола.
  6. Обеспечить поддержку BINDF_NO_UI и BINDF_SILENTOPERATION.
  7. Добавьте подраздел для вашего обработчика протокола в реестре в HKEY_CLASSES_ROOT \ PROTOCOLS \ Handler.
  8. Создайте строковое значение CLSID в подразделе и установите для строки значение CLSID вашего обработчика протокола.

Посмотрите Об Асинхронных Сменных Протоколах на MSDN для получения дополнительной информации на стороне Windows. Существует также образец в Windows SDK.

Быстрый Google также показал эту статью на codeproject: http://www.codeproject.com/KB/IP/DataProtocol.aspx .

Наконец, как сотрудник службы безопасности, я должен указать, что этот код должен быть усилен в бою. Это связано с высокой степенью риска, потому что для надежного выполнения этого вы не можете сделать это в управляемом коде и должны делать это в C ++ (я полагаю, вы могли бы использовать VB6). Вы должны подумать, действительно ли вам нужно это делать, и если вы это сделаете, тщательно продумайте его и надежно закодируйте. Злоумышленник может легко контролировать передаваемый вам контент, просто включив ссылку на страницу. Например, если у вас простое переполнение буфера, тогда никто не сделает этого:<a href="custom:foooo{insert long string for buffer overflow here}"> Click me for free porn</a>

Настоятельно рекомендуем использовать strsafe и новые безопасные методы CRT, включенные в компиляторы VC8 и выше. Видеть http://blogs.msdn.com/michael_howard/archive/2006/02/27/540123.aspx, если вы не знаете, о чем я говорю.

Питер Элерт
источник
6
Это всего лишь пример чего-то, что побуждает пользователей нажимать на него.
Питер Элерт
пожалуйста, объясните это: «потому что, чтобы сделать это надежно, вы не можете сделать это в управляемом коде и должны делать это в C ++»
LogicDaemon
2
Это время выполнения .Net 2.0 (обратите внимание, это включает 3.0 и 3.5). Он не поддерживал разные среды CLR в одном и том же процессе, поэтому, если я написал обработчик 1.0, а вы написали 2.0, и оба наших продукта были установлены на компьютере клиента, мы вместе обеспечили бы сбой браузера каждый раз это запущено. Среда выполнения 4.0 пыталась решить эту проблему, но, насколько я помню, все еще существуют граничные случаи, о которых нужно беспокоиться. Но суть заключается в том, что использование объектов .Net для плагинов в нативных процессах было абсолютно необходимо избегать до 4.0, и, возможно, все еще есть поводы для беспокойства.
Питер Элерт
19

Вот список зарегистрированных схем URI . У каждого есть RFC - документ, определяющий его, который является почти стандартом. RFC сообщает разработчикам новых приложений (таких как браузеры, FTP-клиенты и т. Д.), Что им необходимо поддерживать. Если вам нужен новый протокол базового уровня, вы можете использовать незарегистрированный протокол. Другие ответы скажут вам как. Пожалуйста, имейте в виду, что вы можете многое сделать с существующими протоколами, таким образом получая свои существующие реализации.

Юваль Ф
источник
6
Несмотря на технические детали того, как заставить протокол работать в Windows - это самый важный ответ. Не следует создавать новую схему URI, если она не зарегистрирована в IETF или не использует экспериментальное пространство имен (например, префикс X)
Alnitak
4

Для большинства продуктов Microsoft (Internet Explorer, Office, диалоговые окна «открыть файл» и т. Д.) Вы можете зарегистрировать приложение, которое будет запускаться при открытии URI с соответствующим префиксом. Это часть более общего объяснения - как реализовать собственный протокол.

Для Mozilla объяснение здесь , Java - здесь .

Дмитрий Халатов
источник
2

Это называется протокол. Единственное, что мешает вам составить собственный протокол, это то, что вы должны:

  1. Напишите браузер или пользовательский агент некоторых видов, который понимает этот протокол, как в форме URL, так и в фактическом формате данных.
  2. Напишите сервер, который понимает этот протокол
  3. Желательно иметь спецификацию протокола, чтобы браузер и сервер могли продолжать совместную работу.

Windows делает № 1 действительно простым, и во многих случаях это все, что вам действительно нужно. Viz:

Регистрация приложения в протоколе URL

JSB ձոգչ
источник
1

Первый раздел называется протоколом, и да, вы можете зарегистрировать свой собственный. В Windows (где я предполагаю, что вы делаете это с помощью тега C # - извините фанатов Mono), это делается через реестр .

GaryF
источник
-10

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

Kibbee
источник
4
-1: вводит в заблуждение, использует неточную номенклатуру и не дает никакой реальной ценности
Марек