У меня есть одноэкземплярное приложение clickOnce winFrom с соответствующим типом файла.

Когда я запускаю приложение в режиме отладки и вручную ввожу аргументы командной строки через настройки отладки, все работает так, как ожидалось. Файл, указанный в аргументах отладки, обрабатывается, и все идет по плану.

Когда я дважды щелкаю связанный тип файла (либо в режиме отладки, либо в реальном времени), аргумент командной строки (%1) по какой-то причине не передается приложению. Его просто нет.
У меня есть расширение файла, установленное в моей публикации> параметры> ассоциации файлов. У меня есть записи реестра следующим образом:

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

Это действительно открывает приложение при двойном щелчке файла. единственное, чего не хватает, это имя отправляемого файла (для открытия и обработки).

Любые идеи, что может привести к чему-то подобному?

РЕДАКТИРОВАТЬ: может быть важно отметить, что файл является просто сериализованным объектом. Цель состоит в том, чтобы десериализовать и обработать объект после двойного щелчка по файлу. Логика для этого уже существует и работает, когда я использую аргумент командной строки отладки.

Environment.GetCommandLineArgs() возвращает только путь к исполняемому файлу в (0).

My.Application.CommandLineArgs.count = 0

1
stevo22 10 Фев 2015 в 21:30
На всякий случай: я проверяю аргументы двумя способами: environment.getcommandlineargs() И My.Application.CommandLineArgs.
 – 
stevo22
10 Фев 2015 в 21:33
Когда вы говорите «его просто нет», вы имеете в виду, что не получаете никаких аргументов. Или то, что вы ожидаете, не происходит... и, возможно, вы получаете аргументы, но не то, что вы ожидаете получить, и, следовательно, то, что вы ожидаете, не происходит?
 – 
aphoria
10 Фев 2015 в 23:21
Извините, что не включил эту ясность. В моем предыдущем комментарии я перечислил два метода получения аргументов. Я не вижу никаких аргументов в этих переменных в событиях моего приложения для запуска или startupNextInstance. командаlineargs.count = 0.
 – 
stevo22
10 Фев 2015 в 23:54

2 ответа

Обновить

Взгляните на эту ссылку, WPF: поддержка аргументов командной строки и расширений файлов. Код там C#, но я думаю, что его должно быть просто продублировать в VB.

Запуск с помощью двойного щелчка по пользовательскому типу файла.

Я создал приложение, которое поддерживает пользовательский формат документа, и мне нужно было дважды щелкнуть этот документ, чтобы открыть мое приложение. Я предполагал, что приложение откроется нормально с документом, представленным в виде аргумента командной строки, но это не так. Вместо этого он хранится в следующей скороговорке:

AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0]
1
aphoria 11 Фев 2015 в 22:42
Я скопировал это прямо из моего типа файла в реестре. Он был добавлен автоматически через VS, когда я связал тип файла... Я предполагаю, что ShOpenVerbExtention сопоставляется с правильным файлом (он соответствует моему GUID в реестре), и он действительно открывает программу, когда я дважды щелкаю ассоциированный файл. и %1 (из того, что я читаю) указывает расположение имени файла, также известного как arg
 – 
stevo22
10 Фев 2015 в 22:29
Поскольку программа открывается, я предполагаю, что DLL и точка входа верны, поскольку она выполняется, как и ожидалось. правильно ли% 1? может быть что-то в настройках моего приложения блокирует аргументы, передаваемые в программу?
 – 
stevo22
10 Фев 2015 в 22:44
В каком разделе реестра находится эта командная строка? Вы уверены, что эта команда выполняется, когда вы дважды щелкаете файл этого типа?
 – 
aphoria
10 Фев 2015 в 23:14
Он находится под именем приложения> оболочка> открыть> команда> по умолчанию REG_SZ (тип). Согласно моим исследованиям, это команда, выдаваемая при активации связанного файла (двойной щелчок). когда я вставляю информацию (удаляя% 1) в «выполнить», она запускает программу, как и ожидалось.
 – 
stevo22
10 Фев 2015 в 23:16
Что произойдет, если вы вставите команду в поле «Выполнить», а также укажете путь и имя файла, который будет параметром, а затем запустите ее?
 – 
aphoria
11 Фев 2015 в 15:29

В программе - страница свойств - в разделе «Публикация» - кнопка «Параметры». Вы выбрали «Ассоциации файлов», скажем, .mp3 или что-то еще. ЭТО заставляет программу открываться библиотекой поддержки развертывания приложений ClickOnce, а не вашей программой напрямую!

Если вы удалите это и вручную выберете ассоциации файлов, щелкните файл правой кнопкой мыши и выберите «Открыть с помощью -» и используйте по умолчанию, тогда параметр %1 в commandlineargs будет там.

В качестве альтернативы, если вы не хотите, чтобы пользователь делал это. Вам нужно получить аргументы командной строки в другом месте — из 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-й элемент по-прежнему будет местоположением вашей программы.

0
Georg 6 Дек 2018 в 06:52