Frage

Ich entwickle eine Java -Anwendung mithilfe einer Windows -Desktop -Suche, aus der ich einige Informationen zu Dateien auf meinem Computer wie URLs abrufen kann (URLs (System.Itemurl). Ein Beispiel für eine solche URL ist

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

Für "normale" Dateien. Dieses Feld gibt auch URLs von Mail -Elementen, die aus Outlook oder Thunderbird indiziert sind. Die Elemente von Thunderbird (nur mit Vista und sieben verfügbar) sind ebenfalls Dateien (.wdseml). Die URLs von Outlook -Artikeln beginnen jedoch mit "Mapi: //" wie:

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

Das Problem, das ich habe, ist das Öffnen des realen Elements von Java in Outlook mit dieser URL. Wenn ich es im Dialogfeld Windows kopiere/einfüge, funktioniert es. Es funktioniert auch, wenn ich "Start" verwende, gefolgt von der kopierten/eingefügten URL in der Befehlszeile.

Die URL scheint in UTF-16 codiert zu sein. Ich möchte in der Lage sein, einen solchen Code zu schreiben:

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

Ich arbeite nicht und habe andere Lösungen ausprobiert wie:

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

ohne Erfolg. Mit der obigen Lösung enthält die Datei "test.bat" die richtige URL und den Befehl "Start", aber der Lauf von "test.bat" führt zu der bekannten Fehlermeldung:

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

Hat jemand eine Idee, um "Mapi: //" -Pelemente von Java öffnen zu können?

War es hilfreich?

Lösung

Nun, meine Frage war ein bisschen schwierig. Aber ich habe endlich eine Antwort gefunden und werde sie hier teilen.

Was ich vermutete, war wahr: Windows verwendet UTF-16-URLs (Little Endian). Es macht keine Unterschiede in UTF-8, wenn wir nur Pfade zu Dateien wie Bildern, Text usw. verwenden. Um jedoch auf Outlook-Elemente zugreifen zu können, müssen wir UTF-16LE verwenden. Wenn ich in C#codieren würde, hätte es kein Problem gegeben. Aber in Java muss man erfinderischer sein.

Von der Windows -Desktop -Suche holen ich Folgendes ab:

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

Und was ich getan habe, ist ein temporäres VB -Skript zu erstellen und es so auszuführen:

/**
 * 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){}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top