1

我有一个具有关联文件类型的单实例 clickOnce winFrom 应用程序。

当我在调试中运行应用程序并通过调试设置手动输入命令行参数时,一切都按预期工作。调试参数中指定的文件已被处理,一切都按计划进行。

当我实际双击关联的文件类型(调试或实时)时,由于某种原因,命令行 arg (%1) 未传输到应用程序。它只是不存在。
我确实在我的发布>选项>文件关联中设置了文件扩展名。我确实有如下注册表项:

rundll32.exe dfshim.dll, ShOpenVerbExtension {c0a5ac53-477c-4f76-bfc7-aa99e87cbe21} %1

这实际上会在双击文件时打开应用程序。唯一缺少的是发送文件名(要打开和处理)。

任何想法可能导致这样的事情发生?

编辑:请注意该文件只是一个序列化对象可能很重要。目的是在双击文件后反序列化和处理对象。当我使用调试命令行 arg 时,执行此操作的逻辑已经到位并且可以正常工作。

Environment.GetCommandLineArgs() 仅返回 (0) 中的可执行文件的路径。

My.Application.CommandLineArgs.count = 0

4

2 回答 2

1

更新

看看这个链接,WPF: Supporting command line arguments and file extensions。那里的代码是 C#,但我认为在 VB 中复制应该很简单。

通过双击自定义文件类型启动。

我创建了一个支持自定义文档格式的应用程序,我想双击该文档来打开我的应用程序。我假设应用程序会以命令行参数的形式正常打开应用程序,但事实并非如此。相反,它存储在以下绕口令中:

AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0]
于 2015-02-10T19:17:22.253 回答
0

在程序 - 属性页面 - 在发布 - 选项按钮下,您选择了“文件关联”,比如 .mp3 或其他。这会强制程序由 ClickOnce 应用程序部署支持库打开 - 而不是您的程序直接打开!

如果您删除它并手动进入选择文件关联,右键单击文件并选择使用 - 打开并用作默认值,那么 commandlineargs 中的 %1 参数将在那里。

或者,如果您不希望用户这样做。您需要在其他地方获取命令行参数 - 从 AppDomain。以下代码将允许您在应用程序上拖放多个文件或允许您双击。

    Dim strcmdLineArguments() as String = Environment.GetCommandLineArgs
    If AppDomain.CurrentDomain.SetupInformation.ActivationArguments IsNot Nothing Then
        Dim addInfo() As String = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData
        i = strcmdLineArguments.Length
        ReDim Preserve strcmdLineArguments(i + addInfo.Length - 1)
        For j = 0 To addInfo.Length - 1
            strcmdLineArguments(i + j) = addInfo(j)
        Next
    End If

这应该可以解决问题,你的 strcmdlinearguments 应该有你想要的。忘了添加,第 0 个元素仍然是你程序的位置

于 2018-12-01T20:31:09.047 回答