2

特定のファイル タイプのファイル関連付けを登録する必要があります。実際、特定の Java プログラムを特定の引数とそのファイルの名前で起動するだけで済みます。

私は次のようになりました:

// in fff-assoc.cmd file:
assoc .fff=SomeFile
ftype SomeFile=java -jar some.jar <arguments1> "%%1" <arguments2>

ASCII ファイル名に対して適切に機能します。しかし、名前に非 ASCII 記号を含むファイルをダブルクリックしようとすると、渡された引数は "????" のようになります。(各文字の int 値 = 63)。

これらの関連付けを修正するにはどうすればよいですか?

4

3 に答える 3

2

ボビンスの言うことが正確で、データを Java に直接確実に取得できない場合、別の言語 (C、C++、または C# など) で小さな「シム」プログラムを作成することも 1 つの代替ソリューションです。

この考え方は、プログラムが入力を UNICODE として取得し、ASCII 文字のみを使用して表現できるようにエンコードし (たとえば、base64 を使用するか、すべての文字を同等の数値としてエンコードするのと同じくらい簡単なことで)、コマンドライン引数を次のようにアセンブルするというものです。 CreateProcess を使用して Java 自体を使用および起動します。

Java コードはエンコーディングを「元に戻す」ことができ、UNICODE 名を再構築して使用を続行できます。これは少し回りくどい方法であり、ソフトウェアに追加のコンポーネントが必要ですが、実際の制限である場合は、上記の制限を回避する必要があります。

更新: これは shim プログラムの基本コードです。入力をコロンで区切られた一連の整数としてエンコードします。エラーチェックに関してはあまり効果がなく、少し改善したいと思うかもしれませんが、少なくとも開始して正しい方向に進むようにする必要があります。

Visual Studio Express (まだ Visual Studio を持っていない場合) を取得して、新しい Visual C++ プロジェクトを作成し、[Win32] を選択して [Win32 プロジェクト] を選択します。「Win32 アプリケーション」を選択します。プロジェクトが作成されたら、表示される .cpp ファイル内のすべてを次のコードに置き換えます。

#include "stdafx.h"
#include <string>

int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR lpCmdLine, int)
{
    std::string filename;

    while((lpCmdLine != NULL) && (*lpCmdLine != 0))
    {
        if(filename.length() != 0)
            filename.append(":");

        char buf[32];

        sprintf(buf, "%u", (unsigned int)(*lpCmdLine++));

        filename.append(buf);   
    }

    if(filename.length() == 0)
        return 0;

    PROCESS_INFORMATION pi;
    memset(&pi, 0, sizeof(PROCESS_INFORMATION));

    STARTUPINFOA si;
    memset(&si, 0, sizeof(STARTUPINFOA));
    si.cb = sizeof(STARTUPINFOA);

    char *buf = new char[filename.length() + 256]; // ensure that 256 is enough for your extra arguments!

    sprintf(buf, "java.exe -jar some.jar <arguments1> \"%s\" <arguments2>", filename.c_str());

    // CHECKME: You hard-coded the path for java.exe here. While that may work on your system
    // is it guaranteed that it will work on every system?

    if(CreateProcessA("C:\\Program Files\\Java\\jre7\\bin\\java.exe", buf, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
    {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }

    delete[] buf;

    return 0;
}

コンパイル方法などの詳細をかなり簡単に把握できるはずです。

于 2012-11-24T10:29:27.453 に答える
1

コマンド ラインから Java を呼び出す場合、パラメータのエンコーディングを指定できます (これは で文字列を作成するために使用されますargs[])。

java -jar -Dsun.jnu.encoding=cp1252 yourFileName

非 ASCII 文字を使用する場合、指定された文字セットは の値に影響しますargs[0]。ただし、それがファイルの関連付けに適用されるかどうかはわかりません。

注: そのパラメーターが他にどのように使用されているかはわかりません。この投稿では、何も言われていないようです。

于 2012-11-24T09:57:26.090 に答える
1

特定の Java プログラムを特定の引数とそのファイルの名前で起動する必要があるだけです。

残念ながら、Java が (特に) 引数入力を受け取るために使用する標準 C ライブラリの MS 実装により、この「ただ」は実際には不可能です。標準の Java または C インターフェイスをバイパスして、ネイティブの Win32 API に直行しない限り、

背景については、この質問を参照してください。

于 2012-11-22T15:31:57.777 に答える