建议

建议

我已经编写了一个创建 的注册表.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.exeC:\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

相关内容