Como crio meu próprio protocolo de URL? (por exemplo: //…) [fechado]

212

Eu tenho visto:

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

Como é a primeira seção em que você vê httpe coisas do gênero?

Posso registrar o meu?

Michael Beck
fonte
5
Não tenho certeza se isso precisa das tags c # e .net, é mais amplo que isso.
Rob Hruska
Isso é justo. Eu apenas o marquei dessa maneira porque estávamos pensando em usar o C # para implementar algo assim. Obrigado embora. :-)
Michael Beck
14
O nome correto é "esquema" (consulte RFC 2616 e 2396). Mesmo que muitos esquemas de URL são nomeados após os protocolos, isso não implica que a única maneira de acessar o recurso é através do protocolo
Marek
Existem dois tipos de protocolos, mas não sei qual termo usar para diferenciá-los. Os protocolos "arquivo" e "mailto" são processados ​​no cliente. Os protocolos "http" e "ftp" são processados ​​no servidor. No começo, fiquei confuso com as respostas para os protocolos processados ​​no navegador quando quero algo processado no servidor.
user34660

Respostas:

203

A parte com a HTTP://, FTP://, etc são chamados esquemas URI

Você pode registrar seu próprio através do registro.

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

Fontes: https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml , http://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx

James Gregory
fonte
19
E os sistemas operacionais não Windows?
Bdoserror /
9
"E os sistemas operacionais não Windows?" É específico da aplicação. Eu acho que também costuma ser específico de aplicativos no Windows (isso não fará com que tudo funcione magicamente).
Calum
2
Defina tudo. A entrada do registro informa ao Windows para passar o Uri com esse protocolo para o aplicativo especificado. Todo o resto deve ser tratado pelo próprio aplicativo.
James Gregory
5
O manipulador de protocolo conectável é definitivamente uma escolha melhor.
8
(Default)aqui significa string vazia. Não leve isso literalmente.
deerchao
56

Abra o bloco de notas e cole o código abaixo nele. Mude "YourApp" para o nome do seu aplicativo. Salve-o em YourApp.reg e execute-o clicando nele no explorer. É isso aí! Felicidades! Erwin Haantjes

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
fonte
2
Como a chamada do explorador, o que é a url
imp
@imp, não é uma boa idéia chamar arquivos .reg do (internet) explorer. Você pode usar o comando start para executar um arquivo reg, como 'start yourregfile.reg', mas você receberá uma mensagem rápida do os para certificar-se de adicioná-lo ao registro. Para isso, o usuário deve ter privilégios de administrador.
Codebeat
Na verdade, estou perguntando sobre esta questão stackoverflow.com/questions/24265292/… .
imp
3
O% 1% 2 etc. no arquivo reg são os argumentos do seu aplicativo. Então, se você faz YourApp.exe "o seu argumento" de modo% 1 == "o seu argumento"
Codebeat
1
apenas% 1 é importante, não há como especificar no URL% 2 e% 3 etc #
Trident D'Gao
39

Isso é diferente para cada navegador. No IE e no Windows, você precisa criar o que eles chamam de manipulador de protocolo conectável.

Os passos básicos são os seguintes:

  1. Implemente a interface IInternetProtocol.
  2. Implemente a interface IInternetProtocolRoot.
  3. Implemente a interface IClassFactory.
  4. Opcional. Implemente a interface IInternetProtocolInfo. O suporte ao protocolo HTTP é fornecido pelo manipulador de transações.
  5. Se IInternetProtocolInfo for implementado, forneça suporte para PARSE_SECURITY_URL e PARSE_SECURITY_DOMAIN para que o gerenciador da zona de segurança da URL possa manipular a segurança corretamente. Escreva o código para o seu manipulador de protocolo.
  6. Forneça suporte para BINDF_NO_UI e BINDF_SILENTOPERATION.
  7. Adicione uma subchave ao seu manipulador de protocolo no registro em HKEY_CLASSES_ROOT \ PROTOCOLS \ Handler.
  8. Crie um valor de sequência, CLSID, na subchave e defina a sequência como CLSID do seu manipulador de protocolo.

Consulte Sobre protocolos conectáveis ​​assíncronos no MSDN para obter mais detalhes no lado do Windows. Há também uma amostra no SDK do Windows.

Um rápido google também mostrou este artigo no codeproject: http://www.codeproject.com/KB/IP/DataProtocol.aspx .

Finalmente, como responsável pela segurança, devo salientar que esse código precisa ser reforçado. É um risco elevado, porque para fazê-lo de maneira confiável, você não pode fazê-lo no código gerenciado e precisa fazê-lo em C ++ (suponho que você possa usar o VB6). Você deve considerar se realmente precisa fazer isso e, se o fizer, projete-o com cuidado e codifique-o com segurança. Um invasor pode controlar facilmente o conteúdo que é passado para você simplesmente incluindo um link em uma página. Por exemplo, se você tiver um buffer overflow simples, é melhor que ninguém faça isso:<a href="custom:foooo{insert long string for buffer overflow here}"> Click me for free porn</a>

Considere enfaticamente o uso do strsafe e dos novos métodos seguros de CRT incluídos nos compiladores VC8 e acima. Consulte http://blogs.msdn.com/michael_howard/archive/2006/02/27/540123.aspx se você não tem idéia do que estou falando.

Peter Oehlert
fonte
6
Esse é apenas um exemplo de algo para atrair os usuários a clicar nele.
Peter Oehlert
por favor, explique o seguinte: «porque a fazê-lo de forma confiável você não pode fazê-lo em código gerenciado e tem que fazê-lo em C ++»
LogicDaemon
2
Este é do período de tempo de execução do .Net 2.0 (observe, isso inclui 3.0 e 3.5). Ele não suportava diferentes tempos de execução do CLR no mesmo processo; portanto, se eu escrevesse um manipulador 1.0 e você escrevesse um 2.0, e ambos os nossos produtos fossem instalados no computador de um cliente, juntos garantiríamos que o navegador travasse toda vez foi lançado. O tempo de execução 4.0 tentou direcionar esse problema, mas minha lembrança é de que ainda havia casos limite nos quais se preocupar. Mas a essência do uso de objetos .Net para plug-ins em processos nativos deveria ser absolutamente evitada antes da 4.0 e ainda pode haver casos em que se preocupar.
Peter Oehlert
19

Aqui está uma lista dos esquemas de URI registrados . Cada um tem uma RFC - um documento que a define, o que é quase um padrão. O RFC informa aos desenvolvedores de novos aplicativos (como navegadores, clientes FTP, etc.) o que eles precisam oferecer suporte. Se você precisar de um novo protocolo de nível básico, poderá usar um não registrado. As outras respostas dizem como. Lembre-se de que você pode fazer muitas coisas com os protocolos existentes, obtendo assim as implementações existentes.

Yuval F
fonte
6
Não obstante os detalhes técnicos de como fazer um protocolo funcionar no Windows - esta é a resposta mais importante. Você não deve criar um novo esquema de URI a menos que seja registrado com IETF, ou usando um namespace experimental (como um prefixo X-)
Alnitak
4

Para a maioria dos produtos Microsoft (Internet Explorer, Office, caixas de diálogo "abrir arquivo" etc.), é possível registrar um aplicativo para ser executado quando o URI com o prefixo apropriado for aberto. Esta é uma parte de uma explicação mais comum - como implementar seu próprio protocolo.

Para o Mozilla, a explicação está aqui , Java - aqui .

Dmitry Khalatov
fonte
2

É chamado de protocolo. A única coisa que impede você de criar seu próprio protocolo é o seguinte:

  1. Escreva um navegador ou agente de usuário de alguns tipos que entenda esse protocolo, tanto na forma de URL quanto no formato de dados real
  2. Escreva um servidor que entenda esse protocolo
  3. De preferência, tenha uma especificação para o protocolo para que o navegador e o servidor possam continuar trabalhando juntos.

O Windows facilita muito o número 1 e, em muitos casos, isso é tudo o que você realmente precisa. Viz:

Registrando um aplicativo em um protocolo de URL

JSB ձոգչ
fonte
1

A primeira seção é chamada de protocolo e sim, você pode registrar o seu próprio. No Windows (onde suponho que você esteja fazendo isso com a tag C # - desculpe fãs do Mono), isso é feito através do registro .

GaryF
fonte
-10

Você realmente não precisa se registrar como tal. Eu já vi muitos programas, como o emule, criar seu próprio protocolo específico (é assim que eu acho que é chamado). Depois disso, você basicamente precisa definir alguns valores no registro sobre o programa que lida com esse protocolo. Não tenho certeza se existe algum registro oficial de especificadores de protocolo. Não há realmente muito para impedi-lo de criar seu próprio especificador de protocolo para o seu próprio aplicativo, se você quiser que as pessoas abram o aplicativo pelo navegador.

Kibbee
fonte
4
-1: misguiding, usa nomenclatura imprecisas e não fornece qualquer valor real
Marek