Як створити власний протокол 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

Є два типи протоколів, але я не знаю, який термін використовувати для їх диференціації. Протоколи "файл" і "mailto" обробляються в клієнті. Протоколи "http" і "ftp" обробляються на сервері. Спочатку мене бентежили відповіді на протоколи, оброблені в браузері, коли я хочу щось, що обробляється на сервері.
користувач34660

Відповіді:


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 (це не призведе до того, що все магічно працює).
Калам

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\""

2
як зателефонувати з Explorer, яка URL
імп.

@imp, це не розумна ідея викликати .reg файли від (Internet) Explorer. Ви можете скористатися командою start для виконання файлу reg, наприклад "start yourregfile.reg", але ви отримаєте повідомлення від оператора os, щоб обов'язково додати його до реєстру. Для цього користувач повинен мати права адміністратора.
Codebeat

Насправді я задаю це питання stackoverflow.com/questions/24265292/… .
імп

3
% 1% 2 і т.д. у файлі рег. Є аргументами для вашої програми. Тож якщо ви зробите 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 вашого обробника протоколу.

Докладніше про сторону Windows див. У розділі Про асинхронні підключаються протоколи на MSDN . Також є зразок у вікні 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


1

Перший розділ називається протоколом, і так, ви можете зареєструвати свій власний. У Windows (де я припускаю, що ви робите це з огляду на тег C # - вибачте шанувальників Mono), це робиться через реєстр .



-10

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


4
-1: неправильно керується, використовує неточну номенклатуру і не надає ніякої реальної цінності
Марек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.