独自のURLプロトコルを作成するにはどうすればよいですか?(例:so://…)[終了]


212

私は見た:

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

あなたが見る最初のセクションなどは何とhttp呼ばれていますか?

自分で登録できますか?


5
これにc#および.netタグが必要かどうかはわかりませんが、それよりも広い範囲です。
Rob Hruska、

それは公正です。このようにタグ付けしたのは、C#を使用してこのようなものを実装することを計画していたためです。ありがとう。:-)
マイケルベック

14
正しい名前は「scheme」です(RFC 2616および2396を参照)。多くのURLスキームがプロトコルにちなんで命名されている場合でも、リソースにアクセスする唯一の方法がプロトコル経由であるという意味ではありません
Marek

プロトコルには2つのタイプがありますが、それらを区別するためにどの用語を使用するかわかりません。「ファイル」および「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以外のOSについてはどうですか?
Bdoserror 2008

9
「Windows以外のOSについてはどうですか?」これはアプリケーション固有です。私は、実際にはWindowsでもアプリケーション固有であることが多いと思います(すべてが魔法のように機能するわけではありません)。
Calum

2
すべてを定義します。レジストリエントリは、指定されたアプリケーションにそのプロトコルを使用してUriを渡すようにWindowsに指示します。それ以外はすべてアプリケーション自体で処理する必要があります。
James Gregory

5
プラグ可能なプロトコルハンドラーは間違いなく優れた選択肢です。

8
(Default)ここでは空の文字列を意味します。文字通りそれを取らないでください。
deerchao 2013

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
エクスプローラから呼び出す方法、URLは何ですか
imp

@imp、(インターネット)エクスプローラーから.regファイルを呼び出すのは賢い考えではありません。startコマンドを使用して、「start yourregfile.reg」などのregファイルを実行できますが、OSからプロンプトメッセージが表示され、必ずレジストリに追加してください。これを行うには、ユーザーに管理者権限が必要です。
コードビート、2014年

実際、私はこの質問について尋ねています。stackoverflow.com/ questions / 24265292 / … 。
インプ

3
regファイルの%1%2などは、アプリの引数です。つまり、YourApp.exe "your argument"を実行すると、%1 == "your argument"
Codebeat

1
重要なのは%1だけで、%2や%3などのURLで指定する方法はありません
Trident D'Gao

39

これはブラウザごとに異なります。IEとウィンドウでは、プラグ可能なプロトコルハンドラと呼ばれるものを作成する必要があります。

基本的な手順は次のとおりです。

  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の非同期プラグ可能なプロトコルについてを参照してください。Windows SDKにもサンプルがあります。

簡単なグーグルはまた、コードプロジェクトに関するこの記事を示しました: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と、VC8以降のコンパイラに含まれる新しい安全なCRTメソッドの使用を強く検討してください。私が何について話しているのか分からない場合は、http://blogs.msdn.com/michael_howard/archive/2006/02/27/540123.aspxを参照してください。


6
これは、ユーザーにクリックするように誘うもののほんの一例です。
Peter Oehlert、2008

これについて説明してください:«確実に実行するには、マネージコードでは実行できず、C ++で実行する必要がある»
LogicDaemon

2
これは、.Net 2.0ランタイム(注、これには3.0と3.5が含まれています)のタイムフレームによるものです。同じプロセスで異なるCLRランタイムをサポートしていなかったため、1.0ハンドラーを作成し、2.0ハンドラーを作成した場合、両方の製品がお客様のコンピューターにインストールされていれば、ブラウザーが毎回クラッシュすることになります。それがローンチした。4.0ランタイムはこの問題をターゲットにしようとしましたが、私の記憶は、まだ懸念すべき境界ケースがあったことです。しかし、要点は、ネイティブプロセスでプラグインに.Netオブジェクトを使用することであり、4.0より前のバージョンでは絶対に回避されていました。
Peter Oehlert、2015

19

登録されているURIスキームのリストを次に示します。それぞれにRFCがあります。これは、RFCを定義するドキュメントであり、ほぼ標準です。RFCは、新しいアプリケーション(ブラウザ、ftpクライアントなど)の開発者に、サポートする必要があることを伝えます。新しい基本レベルのプロトコルが必要な場合は、未登録のプロトコルを使用できます。他の答えはあなたに方法を教えてくれます。既存のプロトコルを使用して多くのことを実行できるため、既存のプロトコルを実装できることに留意してください。


6
Windowsでプロトコルを機能させる方法の技術的な詳細にもかかわらず、これが最も重要な答えです。IETFに登録されていないか、実験的な名前空間(X-プレフィックスなど)を使用していない限り、新しいURIスキームを作成しないでください
Alnitak


2

それはプロトコルと呼ばれています。独自のプロトコルを作成できないのは、次のことだけです。

  1. URL形式と実際のデータ形式の両方で、そのプロトコルを理解するある種のブラウザまたはユーザーエージェントを記述します。
  2. そのプロトコルを理解するサーバーを書く
  3. ブラウザとサーバーが引き続き連携できるように、プロトコルの仕様を用意してください。

Windowsは#1を本当に簡単にします。多くの場合、これが実際に必要なすべてです。Viz:

URLプロトコルへのアプリケーションの登録


1

最初のセクションはプロトコルと呼ばれ、自分で登録できます。Windows(C#タグを指定してこれを実行していると想定している場合-申し訳ありませんが、Monoファン)では、レジストリを介して行われます



-10

このように実際に登録する必要はありません。私はエミュールのような多くのプログラムが独自のプロトコル固有のものを作成するのを見てきました(それが私がそれを呼ばれていると私が思うものです)。その後、基本的には、どのプログラムがそのプロトコルを処理するかについて、レジストリにいくつかの値を設定する必要があります。プロトコル指定子の公式のレジストリがあるかどうかはわかりません。ユーザーがブラウザからアプリを開くようにしたい場合は、独自のアプリケーション用に独自のプロトコル指定子を作成するのを止めることはあまりありません。


4
-1:誤解を招き、不正確な用語を使用し、真の価値を提供しない
Marek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.