我已经编写了一个创建 的注册表.myext
。
双击我的file.myext
指的是我的可执行文件(从打开的批处理文件转换而来.jar
),然后打开我的记事本应用程序。
注册表
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.myext]
@="myext"
[HKEY_CLASSES_ROOT\.myext\ShellNew]
[HKEY_CLASSES_ROOT\myext]
@=".myext file"
"EditFlags"=dword:00000000
"BrowserFlags"=dword:00000008
[HKEY_CLASSES_ROOT\myext\DefaultIcon]
@="C:\\...\\icon.ico, 0"
[HKEY_CLASSES_ROOT\myext\shell]
[HKEY_CLASSES_ROOT\myext\shell\Open]
[HKEY_CLASSES_ROOT\myext\shell\Open\command]
@="C:\\...\\run.exe %1"
我的可执行文件(run.exe)是从批处理转换而来的
start /min "C:\...\javaw.exe -jar" "C:\...\mjar.jar"
问题?
我不知道为什么我会收到这个错误信息。也许是此转换应用程序这导致了一些问题。
建议
这是我根据大家的建议所做的。单击文档后,我可以成功打开文本编辑器(使用以下任何建议之一),但其中没有显示任何文本JTextPane
。如果我选择在 Windows 记事本中打开文档,则所有文本都会显示出来。
PS 我没有使用 DDE,因此不再收到错误消息:"file.myext" is not a valid Win32 application
。
批处理文件建议
start "Mike's Text Editor" /min "C:\...\javaw.exe" -jar "C:\...\mjar.jar"
start /min "C:\...\javaw.exe -jar" "C:\...\mjar.jar" "%1"
注册建议
[HKEY_CLASSES_ROOT\myext\shell\open\command]
@="\"C:\\...\\run.exe\" \"%1\""
答案1
新答案
这是正确联想所需的最低限度。我通过尝试下面的第 4 条技巧发现了这一点(您可以了解 Windows 如何为您完成此操作...)。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.myext]
@="myext"
[HKEY_CLASSES_ROOT\myext]
@=".myext file"
[HKEY_CLASSES_ROOT\myext\shell]
[HKEY_CLASSES_ROOT\myext\shell\open]
[HKEY_CLASSES_ROOT\myext\shell\open\command]
@="\"C:\\...\\run.exe\" \"%1\""
您可以根据需要添加 DefaultIcon 和其他内容,但如果没有 DefaultIcon,Windows 将只使用图标run.exe
(如果有)。您可以在批处理到 Exe 转换器当您创建run.exe
)。
%1
和引号的重要性
之所以需要在%1
此处放置 ,是为了将关联文件 ( ) 的路径和名称传递file.myext
到程序 中run.exe
。如果不传递此值,您的关联将毫无意义,因为它只是用作快捷方式。这是不必要的,因为您可以简单地创建一个普通的快捷方式来run.exe
实现相同的目的。
你的批处理文件应该还里面有一个%1
地方,以便关联文件的路径和名称(file.myext
)是用过的在批处理文件中(大概是将它传递给你的,mjar.jar
它将做一些事情和该文件)。否则,无论你双击哪个关联文件,你都会从 Java 程序中获得相同的结果。这再次毫无意义,因为你可以简单地使用批处理文件的快捷方式来实现相同的目的。
用引号括起来也很重要%1
,因为文件路径可以包含空格,如果没有引号("
),这些空格会将路径分成两个或多个参数(当整个路径被视为一个参数时)。
示例批处理文件
这是我为了测试而转换的批处理文件exe
。它只是显示 的值%1
。
@echo %1
@pause
您的批处理文件可能如下所示(这样mjar.jar
可以获取您双击的文件的路径和名称):
start /min "C:\...\javaw.exe -jar" "C:\...\mjar.jar" "%1"
我将exe
文件与.myext
扩展名关联(使用技巧 4 中的方法),然后检查注册表以创建上述.reg
文件。当我双击带有.myext
扩展名的文件时,会打开一个命令窗口,显示(echo
命令)我双击的文件的路径和名称(这是我的测试批处理文件使用关联文件)。
Java 程序
(这是全面聊天讨论最终解决了你的问题。)包含在中的 Java 程序mjar.jar
必须准备好接受传入的参数并使用它。您的意图是让您的程序自动打开传入参数引用的文件并显示其内容。因此该main
方法应该是这样的:
public static void main (String[] args) {
if (args.length >= 1) {
openFile(args[0]);
}
}
方法openFile
是使用传递给它的名称打开文件的方法。该if
语句确保args[0]
只有当有这样的参数时才会读取(避免)。上面的代码中ArrayIndexOutOfBoundsException
只使用了第一个参数;所有其他参数( 、等)都被忽略。该方法将类似于(args[0]
args[1]
args[2]
openFile
未包含描述符和返回类型):
openFile(String filename) {
// code here to open the file referred by "filename" variable,
// read its contents and display it on the GUI
// or use it in the program as intended
}
如果你的程序有一个打开命令内置于其 GUI 中,用户使用此命令选择文件后,您的应用程序可以使用openFile
上面相同的方法打开所选文件并显示其内容。
上一个答案
我对你的问题没有明确的答案然而,但这里有一些建议可以帮助你入门:
您是否尝试过添加引号?像这样:
@="\"C:\\...\\run.exe\" \"%1\""
在注册表中,(默认)值将显示如下:"C:\...\run.exe" "%1"
阅读微软官方有关文件类型关联的 MSDN 文档。您还必须阅读有关程序标识符的资料(链接在该文档的第一段中)。
首先尝试将您的
.myext
文件类型与记事本关联。了解记事本如何与.txt
文件关联并按照示例操作。如果操作正确,记事本应该会打开您的file.myext
文件。您可以了解 Windows 如何为您执行此操作。右键单击
file.myext
,单击打开方式>选择默认程序...^ 和浏览找到您的run.exe
文件。关联并打开,然后调查 Windows 注册表以找出 Windows 如何存储您的手动关联。然后,您只需将文件类型和程序标识符导出到 reg 文件即可。
^ 如果file.myext
没有关联,请点击打开 > 从已安装程序列表中选择一个程序。
PS1:显然,你必须.reg 文件中有双反斜杠。PS2
:最好直接编辑注册表中的内容,测试效果,然后将密钥导出到 .reg 文件并将它们合并为一个文件,而不是自己创建 .reg 文件。
答案2
您的问题在于您如何使用该start
命令。
通过将第一个参数放入,""
您可以将其指定为启动程序的窗口标题。然后您将它传递%1
给它(您在问题的评论中注明)。%1
是您单击的文件的文件名.myext
。所以那是文件start
尝试执行。
这会导致您看到的错误。
因此,要解决这个问题,只需start
像这样使用:
start "something" /min "C:\...\javaw.exe" -jar "C:\...\mjar.jar"
传递给的第一个参数start
被括在内,""
预计是标题结果(控制台)窗口。
第二个参数(不以 开头/
)应为可执行文件开始。如果路径包含空格,则需要用 括起来""
。否则,它们是可选的。
第三个和所有后续参数都将传递给可执行文件。
因此,这些参数不需要""
单独括起来。但您做需要将路径(包含空格)括在这些参数中,""
以便可执行文件启动时就能正确解析它们。
答案3
问题
您的命令设置为:
@="C:\\...\\run.exe %1"
空格是分隔符,用于分隔命令及其参数的不同部分。如果文件名中没有空格,那么它将起作用:
C:\Foobar\run.exe c:\test.myext
如果传递的文件(或其路径)中有空格,程序可能会或可能不会正常工作,具体取决于它如何解释其参数:
C:\Foobar\run.exe C:\My Docs\test.myext /switch
C:\My
参数一和参数二是吗Docs\test.myext
?所有参数都是单个字符串吗?是否有一些特殊的解释?
如果您的程序(或其路径)中有空格,那么 Windows 将无法识别哪些部分是路径和/或文件名,哪些部分是其他参数:
C:\Program Files\Foobar\run.exe C:\test.myext
Windows 尝试运行该文件并将和作为参数C:\Program
传递给它。Files\Foobar\run.exe
C:\test.myext
如您所见,这显然不是一个有效的文件名。如果您在“运行”对话框中输入它,您将得到相同的结果找不到/应用程序无效错误信息。
解决方案
您需要做的是将文件/路径名括在引号中,以表明它们是单个单元。这通常很简单,但并非总是如此。
就你的情况而言,这应该相当简单。如果你直接在 Regedit 中输入,请使用此方法(根据需要替换路径)。导航到HKCR\myext\shell\open\command
并编辑默认项并将其设置为:
"C:\Program Files\Foobar\run.exe" "%1"
如果你将其放入文件中.REG
,请使用以下命令:
[HKEY_CLASSES_ROOT\myext\shell\open\command]
@="\"C:\\Program Files\\Foobar\\run.exe\" \"%1\""
请注意斜杠和引号是如何转义的(使用斜杠),但程序和文件参数都用引号括起来。无论路径/文件名中是否有空格,这都是好的;它更安全。
此外,如果您的程序需要,您可以替换%1
为传递文件的完整限定路径。%L