我需要为某个文件types注册文件关联 – 事实上,我只需要启动某个具有特定参数和该文件名称的Java程序。
我得到了以下几点:
// in fff-assoc.cmd file: assoc .fff=SomeFile ftype SomeFile=java -jar some.jar <arguments1> "%%1" <arguments2>
它适用于ASCII文件名称。 但是当我尝试用名称中的非ASCII符号双击某个文件时,传递的参数看起来像“????” (每个char的整数值= 63)。
我如何解决这些关联?
如果说bobince是准确的,而且你不能直接把数据直接传给java,那么另外一种解决方案就是用另一种语言(例如C,C ++或C#)编写一个小的“shim”程序。
这个想法是,程序抓住输入作为UNICODE,编码,以便它可以只用ASCII字符(例如通过使用base64,或者甚至简单的编码每个字符作为其数字等值),然后将命令行参数组装使用和启动Java本身使用CreateProcess。
您的Java代码可以“撤消”编码,重建UNICODE名称并继续使用它。 这是一个迂回的方式,需要为您的软件额外的组件,但它应该围绕上面详述的限制,如果这确实是一个实际的限制。
更新 :这是shim程序的基本代码。 它将输入编码为由冒号分隔的整数序列。 在错误检查方面,它没有太多的工作,你可能需要稍微改进一下,但至少应该让你开始并朝着正确的方向前进。
您应该抓住Visual Studio Express(如果您还没有Visual Studio)并创建一个新的Visual C ++项目,请选择“Win32”并选择“Win32 Project”。 选择“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; }
你应该能够很容易地掌握如何编译等细节。
我只需要启动一个特定的Java程序,其中包含某些参数和文件的名称。
不幸的是,由于Java用于接收参数输入的标准C库的MS实现,这个“正义”实际上是不可能的。 除非直接使用本机Win32 API,否则绕过标准的Java或C接口,
看到这个问题的背景。
当从命令行调用java时,可以指定参数的编码(将用于在args[]
创建字符串):
java -jar -Dsun.jnu.encoding=cp1252 yourFileName
使用非ASCII字符时,指定的字符集会影响args[0]
的值。 不知道这是否适用于文件关联。
注:我不知道还有什么其他用途的参数 – 这篇文章似乎没有。