“file.myext”不是有效的 Win32 应用程序

Rob*_*Rob 7 windows windows-registry file-extension jar

我写了一个注册表,创建.myext.

双击 myfile.myext指的是我的可执行文件(从打开 a 的批处理文件转换而来.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 Code Online (Sandbox Code Playgroud)

我的可执行文件 (run.exe) 从批处理转换而来

start /min "C:\...\javaw.exe -jar" "C:\...\mjar.jar"
Run Code Online (Sandbox Code Playgroud)

问题?

我不知道为什么我会收到该错误消息。也许正是这个转换应用程序导致了一些问题。


建议

以下是我在大家的建议之后所做的。单击文档后,我能够成功打开我的文本编辑器(使用以下任一建议),但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"
Run Code Online (Sandbox Code Playgroud)
start /min "C:\...\javaw.exe -jar" "C:\...\mjar.jar" "%1"
Run Code Online (Sandbox Code Playgroud)

注册建议

[HKEY_CLASSES_ROOT\myext\shell\open\command]
@="\"C:\\...\\run.exe\" \"%1\""
Run Code Online (Sandbox Code Playgroud)

ADT*_*DTC 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\""
Run Code Online (Sandbox Code Playgroud)

您可以根据需要添加 DefaultIcon 和其他内容,但如果没有 DefaultIcon,Windows 将仅使用 中的图标run.exe(如果有的话。您可以在创建 时在Batch To Exe Converterrun.exe中添加一个)。

%1和引号的重要性

之所以需要放一个%1there,是为了将相关文件()的路径和名称传递file.myext到程序中run.exe。如果不传递此信息,您的关联就毫无意义,因为它只是作为快捷方式发挥作用。这是不必要的,因为您可以简单地创建一个普通的快捷方式来run.exe达到相同的目的。

您的批处理文件内部应该有一个%1位置,以便在批处理文件中使用file.myext关联文件 ( )的路径和名称(大概是将其传递给您的文件,以便文件执行某些操作)。否则,无论您双击哪个关联文件,您都将始终从 Java 程序中获得相同的结果。这再次毫无意义,因为您只需拥有批处理文件的快捷方式即可达到相同目的。mjar.jar

将引号括起来也很重要%1,因为文件路径可以包含空格,如果没有引号 ( "),这些空格可以将路径拆分为两个或多个参数(当整个路径被视为一个参数时)。

批处理文件示例

这是我转换为用于测试的批处理文件exe。它只是显示 的值%1

@echo %1
@pause
Run Code Online (Sandbox Code Playgroud)

您的批处理文件可能如下所示(以便mjar.jar可以获得您双击的文件的路径和名称):

start /min "C:\...\javaw.exe -jar" "C:\...\mjar.jar" "%1"
Run Code Online (Sandbox Code Playgroud)

我将该exe文件与.myext扩展名相关联(使用技巧 4 中的方法),然后检查注册表以创建上述.reg文件。当我双击带有.myext扩展名的文件时,将打开一个命令窗口,显示(echo命令)我双击的文件的路径和名称(这就是我的测试批处理文件使用关联文件的方式)。

Java程序

(这是最终解决您问题的完整聊天讨论的摘要。)中包含的 Java 程序mjar.jar必须准备好接受传入参数并使用它。您的目的是让程序自动打开传入参数引用的文件并显示其内容。因此该main方法应该是这样的:

public static void main (String[] args) {
    if (args.length >= 1) {
        openFile(args[0]); 
    }
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

如果您的程序在其 GUI 中内置了“打开”命令,则在用户使用此命令选择文件后,您的应用程序可以使用与openFile上述相同的方法打开所选文件并显示其内容。

上一个答案

我还没有对您的问题给出明确的答案但这里有一些帮助您入门的提示:

  • 您是否尝试过添加引号?像这样:@="\"C:\\...\\run.exe\" \"%1\""
    在注册表中,(默认)值将显示如下:"C:\...\run.exe" "%1"

  • 阅读有关文件类型关联的Microsoft 官方MSDN 文档。您还必须阅读有关编程标识符的内容(链接在该文档的第一段中)。

  • 首先尝试将您的.myext文件类型与记事本关联。了解记事本如何与.txt文件关联并按照示例进行操作。如果操作正确,记事本应该打开您的file.myext文件。

  • 您可以了解 Windows 如何为您执行此操作。右键单击file.myext,单击打开方式 > 选择默认程序... ^ 并浏览以查找您的run.exe文件。关联并打开,然后调查 Windows 注册表以了解 Windows 如何存储您的手动关联。然后,您可以简单地将文件类型和编程标识符导出到 reg 文件。

^ 如果file.myext未关联,请单击打开 > 从已安装程序列表中选择程序

PS1:显然,.reg 文件中必须有双反斜杠。
PS2:最好直接编辑注册表中的内容,测试效果,然后将密钥导出到.reg文件并将它们组合成一个文件,而不是自己创建.reg文件。