Question

Je développ une application Java à l'aide de Windows Desktop Search à partir de laquelle je peux récupérer des informations sur les fichiers sur mon ordinateur tels que urls ( System.ItemUrl ). Un exemple de cette URL est

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

pour les fichiers "normaux". Ce champ donnent également urls d'articles de courrier indexés à partir d'Outlook ou Thunderbird. Les éléments de Thunderbird (uniquement disponible avec vista et sept) sont également des fichiers (.wdseml). Mais les articles de perspectives de urls commencent par "mapi: //" comme:

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

Le problème que j'ai ouvre l'élément réel de Java dans Outlook en utilisant cette URL. Si je copier / coller dans la boîte de dialogue d'exécution de Windows, cela fonctionne; il fonctionne aussi si je l'utilise « start » suivi de l'URL copié / collé dans la ligne de commande.

L'URL semble être encodé en UTF-16. Je veux être en mesure d'écrire un tel code:

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);

Je ne travaille pas et je l'ai essayé d'autres solutions comme:

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");

sans succès. En utilisant la solution ci-dessus, le fichier « test.bat » contient l'URL correcte et la commande « start », mais le terme des résultats de « test.bat » dans le message d'erreur bien connu:

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

Quelqu'un at-il une idée de pouvoir ouvrir "mapi: //"? Objets de Java

Était-ce utile?

La solution

Eh bien, ma question était un peu délicat. Mais j'ai enfin trouvé une réponse et partagerai ici.

Ce que je soupçonnais était vrai: Windows utilise UTF-16 (little endian) urls. Il ne fait aucune différence de travail en UTF-8 lorsque nous utilisons uniquement des chemins vers des fichiers tels que des images, du texte, etc. Mais pour être en mesure d'accéder à des éléments Outlook, nous devons utiliser UTF-16LE. Si je le codage en C #, il n'y aurait pas eu de problème. Mais en Java, vous devez être plus inventifs.

A partir de Windows Desktop Search, je récupère ceci:

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

Et ce que je faisais est la création d'un script VB temporaire et l'exécuter comme ceci:

/**
 * 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){}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top