2

Windowsデスクトップ検索を使用してJavaアプリケーションを開発します。この検索から、URL( System.ItemUrl )などのコンピューター上のファイルに関する情報を取得できます。そのようなURLの例は

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

「通常の」ファイルの場合。このフィールドには、OutlookまたはThunderbirdからインデックスに登録されたメールアイテムのURLも表示されます。Thunderbirdのアイテム(vistaと7を使用してのみ使用可能)もファイル(.wdseml)です。ただし、OutlookのアイテムのURLは「mapi://」で始まります。

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

私が抱えている問題は、このURLを使用してOutlookでJavaから実際のアイテムを開くことです。Windowsの実行ダイアログでコピーして貼り付けると動作します; コマンドラインで「start」の後にコピー/貼り付けされたURLを使用した場合にも機能します。

URLはUTF-16でエンコードされているようです。私はそのようなコードを書けるようになりたいです:

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

私は動作しません、そして私は次のような他の解決策を試しました:

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

成功せずに。上記の解決策を使用すると、ファイル「test.bat」には正しいURLと「start」コマンドが含まれますが、「test.bat」を実行すると、よく知られているエラーメッセージが表示されます。

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

Javaから「mapi://」アイテムを開くことができるというアイデアはありますか?

4

1 に答える 1

1

さて、私の質問は少しトリッキーでした。しかし、私はついに答えを見つけ、ここでそれを共有します。

私が疑ったのは本当でした。WindowsはUTF-16(リトルエンディアン)のURLを使用しています。画像やテキストなどのファイルへのパスのみを使用する場合、UTF-8での動作に違いはありません。ただし、Outlookアイテムにアクセスできるようにするには、UTF-16LEを使用する必要があります。C#でコーディングしていれば、問題はありませんでした。しかし、Javaでは、より独創的である必要があります。

Windowsデスクトップ検索から、これを取得します。

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

そして、私が行ったことは、一時的なVBスクリプトを作成し、次のように実行することです。

/**
 * 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){}
}
于 2010-03-30T16:51:32.750 に答える