Pergunta

Eu desenvolvo um aplicativo Java usando a pesquisa de desktop do Windows da qual posso recuperar algumas informações sobre arquivos no meu computador, como URLs (System.Itemurl). Um exemplo desse URL é

file://c:/users/ausername/documents/aninterestingfile.txt

para arquivos "normais". Este campo fornece também URLs de itens de correio indexados do Outlook ou Thunderbird. Os itens do Thunderbird (disponíveis apenas usando o Vista e sete) também são arquivos (.wdseml). Mas os URLs dos itens do Outlook começam com "mapi: //" como:

mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가

O problema que tenho é abrir o item real do Java no Outlook usando este URL. Se eu copiar/colá -lo na caixa de diálogo Run of Windows, ele funciona; Ele também funciona se eu usar "Start" seguido pelo URL copiado/colado na linha de comando.

O URL parece estar codificado no UTF-16. Eu quero poder escrever esse código:

String url = "mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가";

Runtime.getRuntime().exec("cmd.exe /C start " + url);

Eu não trabalho e tentei outras soluções como:

String start = "start";
String url = "mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가";

FileOutputStream fos = new FileOutputStream(new File("test.bat");
fos.write(start.getBytes("UTF16");
fos.write(url.getBytes("UTF16"));
fos.close();

Runtime.getRuntime().exec("cmd.exe /C test.bat");

sem nenhum sucesso. Usando a solução acima, o arquivo "test.bat" contém o URL correto e o comando "start", mas a execução de "test.bat" resulta na mensagem de erro bem conhecida:

'■' is not recognized as an internal or external command, operable program or batch file.

Alguém tem uma idéia de poder abrir itens "mapi: //" do Java?

Foi útil?

Solução

Bem, minha pergunta foi um pouco complicada. Mas finalmente encontrei uma resposta e vou compartilhar aqui.

O que eu suspeitava ser verdadeiro: o Windows usa UTF-16 (Little Endian) URLs. Não faz diferenças funcionando no UTF-8 quando usamos apenas caminhos para arquivos como imagens, texto etc. Mas, para poder acessar itens do Outlook, devemos usar o UTF-16LE. Se eu estivesse codificando em C#, não haveria nenhum problema. Mas em Java, você precisa ser mais inventivo.

Na pesquisa de desktop do Windows, eu recupero isto:

mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가

E o que fiz foi criar um script temporário de VB e executá -lo assim:

/**
 * Opens a set of items using the given set of paths.
 */
public static void openItems(List<String> urls) {
  try {

    // Create VB script
    String script =
      "Sub Run(ByVal sFile)\n" +
      "Dim shell\n" +
      "Set shell = CreateObject(\"WScript.Shell\")\n" +
      "shell.Run Chr(34) & sFile & Chr(34), 1, False\n" +
      "Set shell = Nothing\n" +
      "End Sub\n";

    File file = new File("openitems.vbs");

    // Format all urls before writing and add a line for each given url
    String urlsString = "";
    for (String url : urls) {
      if (url.startsWith("file:")) {
        url = url.substring(5);
      }
      urlsString += "Run \"" + url + "\"\n";
    }

    // Write UTF-16LE bytes in openitems.vbs
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(script.getBytes("UTF-16LE"));
    fos.write(urlsString.getBytes("UTF-16LE"));
    fos.close();

    // Run vbs file
    Runtime.getRuntime().exec("cmd.exe /C openitems.vbs");

  } catch(Exception e){}
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top