Способ провести различие между аргументами строки cmd и параметрами перетаскивания на значок в Windows? - PullRequest
2 голосов
/ 04 июня 2011

У меня есть приложение Windows GUI, написанное на C (MinGW), и я хочу, чтобы приложение выполняло разные задачи в зависимости от того, было ли оно запущено из командной строки с аргументом имени файла или путем перетаскивания файла на значок приложения. Как сейчас, следующая функция не различает:

int argc;
LPWSTR *argv = CommandLineToArgvW(GetCommandLineW(),&argc);

Когда файл перетаскивается на значок приложения, он предполагает, что он был запущен из командной строки. Проблема в том, что мне нужны дополнительные аргументы, которые должны быть переданы через командную строку, чтобы сделать что-нибудь полезное. Самого имени файла недостаточно, поэтому приложение просто закрывается, потому что у него недостаточно информации для продолжения.

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

Другая проблема, с которой я сталкиваюсь, заключается в том, что иногда при перетаскивании файла на значок приложения происходит сбой. Я сузил это до всего, что работает на значениях argv []. Он не делает этого, если запускается через командную строку с тем же аргументом. Например, это приведет к сбою приложения примерно в 20% случаев:

fprintf(stderr,"argv[3] was %ls\n",(LPWSTR)argv[3]);

Почему это происходит только при запуске с помощью drag-n-drop? Я на Windows 7 x64.

Ответы [ 3 ]

2 голосов
/ 04 июня 2011

Это, конечно, возможно. Допустим, пользователь должен указать -slow или -fast в командной строке. Ваш код выглядит примерно так:

int main( int argc, char *argv[] ) {
   if ( argv contains "-slow" or -"fast" ) {
      we were launched fronm the command line
   else
      we were either launched from an icon, or the user has
      not specified -slow or -fast. In either case, pop up
      a dialog to get the options
   endif
}
2 голосов
/ 04 июня 2011

Windows по умолчанию будет вызывать вашу программу с именем файла, который вы уронили, на значке в качестве первого и единственного аргумента. Таким образом, в этом случае вы получите точно такие же параметры вызова, которые вы получаете, когда кто-то запускает вашу программу из командной строки с полным квалифицированным именем того же файла, что и один-единственный аргумент.

Однако вы можете добавить дополнительные аргументы к значку ярлыка при установке приложения, т.е. "path\myapp.exe -gui". Это позволяет вам различать вызовы по значку в целом (также относится к двойному щелчку без параметра) и вызовам в командной строке, где параметр -gui обычно не указывается.

1 голос
/ 04 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...