Конференция "WinAPI" » Командная строка
 
  • chuxlo © (02.04.16 18:22) [0]
  • Dimka Maslov © (02.04.16 19:24) [1]
    Лично я в таком случае получаю несколько экземпляров приложения, ассоциированного с расширением. В каждый экземпляр передаётся один файл. А потом уже можно будет собрать файлы в одном экземпляре.
  • chuxlo © (02.04.16 19:40) [2]
    Не думаю, что это выход.Если в каталоге несколько десятков файлов, мне необ-
    ходимо будет несколько десятков экземпляров программы ассоциированых с необходимым типом файлов.
  • Dimka Maslov © (02.04.16 19:59) [3]

    > Не думаю, что это выход


    Венда поступает именно так - она открывает несколько экземпляров.
  • chuxlo © (02.04.16 20:08) [4]
    Хорошо буду думать в этом направлении.Но неужели при выделении 50 mp3 откры
    вается 50 экземпляров WinAmp
  • Pavia © (02.04.16 20:27) [5]
    Проводник запускает несколько программ.
    В каждой программе передаётся по оному файлу. Ваш код создаёт именованный мьютекс. Мьютекс создаёт тот кто первый запустился остальные проверяют есть он или нет. Если нет то он первый.
    Если есть используем межпроцессный обмен данными IPC. Наиболее популярным является через проецируемый файл. Но в вашем случае почтовый ящик лучше подойдёт.
    https://ru.wikipedia.org/wiki/Межпроцессное_взаимодействие

    Передаём через этот ящик в главную программу свои параметры.
    Далее когда получено подтверждение получения. Лишние копии закрываются остается только первая, она же основная.

    И учтите что при создании мьютекса есть ряд особенносий описанных в примечаниях.
    https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682411(v=vs.85).aspx
  • chuxlo © (02.04.16 20:35) [6]
    Благодарю Pavia.Есть информация буду пережевывать.
  • Dmk © (03.04.16 00:13) [7]
    Что за .... Процедура парсинга командной строки пишется за час с отладкой. Максимум 2-3 для новичка. Какие мютексы?!?!?
  • Leonid Troyanovsky © (03.04.16 09:56) [8]

    > Dmk ©   (03.04.16 00:13) [7]

    > Что за ....

    ТС хочет получать группу файлов от проводника.
    Т.е., что-то вроде http://delphimaster.net/view/4-1102448133

    --
    Regards, LVT.
  • Dmk © (03.04.16 14:00) [9]
    >Leonid Troyanovsky ©   (03.04.16 09:56) [8]
    Да понятно. Просто непонятно что сложного в разборе строки состоящей из двойных и одинарных скобок. Я бы выложил, но не хочется халяву разводить. Там головой подумать час времени максимум. У меня 100+ файлов открывается без проблем, хоть с командной строки, хоть с WM_DROPFILES.
  • chuxlo © (03.04.16 18:06) [10]
    Dmk ! Проблема не в том, что я не могу разобрать командную строку.Вместо группы выделенных файлов я получаю один-разбирать нечего.
  • Dmk © (03.04.16 21:48) [11]
    >[10] Бедный. Почитать доку лень.

    Массив должен быть инициализирован до входа в процедуру.
    Надеюсь сможешь под себя модифицировать.

    procedure ParseParamStr(var AFiles: TFilesList);
    var
     lpI: integer;
     lpComLine: string;
     lpComLen: integer;
     lpPos: integer;
     lpNDQ: integer;
     lpChar: char;
     lpZeroStr: string;
     lpNextStr: string;
     lpS: string;
     lpEndLen: integer;
     lpZB: boolean;

    const
     lcDQ = #34;//"
     lcSQ = #39;//'
     lcBadChars: set of AnsiChar = [ #34, #39];

     function CharPossible(AChar: char): boolean;
     begin
       Result := not (CharInSet(AChar, lcBadChars));
     end;

    begin
     lpComLine := GetCommandLine;
     lpComLen := Length(lpComLine);

     //Отладка
     //InfoMessage(0, lpComLine + '
    (Длина = ' + IntToStr(lpComLen) + ')');

     lpNDQ := 0;
     lpPos := 0;
     lpZB := False;

     //Извлекаем нулевой параметр
     //Признак начала и конца нулевого параметра - двойные кавычки -> "ZeroStr"
     for lpI := 1 to lpComLen do
     begin
       lpChar := lpComLine[lpI];
       if lpChar = lcDQ then
       begin
         Inc(lpNDQ);
         lpZB := not lpZB; //Включим флаг открытых скобок
       end;

       //Длина нулевого параметра с кавычками
       //Потребуется для дальнейшего разбора строки
       Inc(lpPos);

       //Если скобка открыта
       if lpZB then
       begin
         //и символ не равен кавычкам
         if (lpChar <> lcSQ) and (lpChar <> lcDQ) then
           lpZeroStr := lpZeroStr + lpChar; //Извлекаем нулевую строку
       end;
       //Выйдем из цикла в конце нулевого параметра
       if (lpChar = lcDQ) and (lpZB = False) then Break;
     end;//for

     //Проверим на первый пробел
     lpChar := lpComLine[lpPos + 1];
     if lpChar = MSG_SPACE then Inc(lpPos, 2); //Начальная позиция остатков строки параметров

     //Следующая строка.
     //Может состоять из нескольких параметров
     lpNextStr := MSG_EMPTY;
     lpEndLen := 0;

     //Копируем остаток для дальнейшего разбора
     for lpI := lpPos to lpComLen do
     begin
       lpChar := lpComLine[lpI];
       lpNextStr := lpNextStr + lpChar;
       Inc(lpEndLen);
     end;

     lpS := MSG_EMPTY;
     //Разбираем остатки строки
     //с проверкой на присутствие файла
     for lpI := 1 to lpEndLen do
     begin
       lpChar := lpNextStr[lpI];

       if lpI = lpEndLen then
       begin
         //Последний символ
         if CharPossible(lpChar) then lpS := lpS + lpChar;
         if FileExist64(lpS) then
         begin
           AFiles.AddRecord(lpS);
           Break;
         end;
       end;

       //Если пробел, то возможно это конец параметра
       //Проверим есть ли такой файл
       if lpChar = MSG_SPACE then
       begin
         //Если файл есть, то добавим его в список файлов
         if FileExist64(lpS) then
         begin
           AFiles.AddRecord(lpS);
           lpS := MSG_EMPTY;
         end
         else
         begin
           //Иначе продолжаем разбирать строку
           if CharPossible(lpChar) then lpS := lpS + lpChar;
         end;
       end //if lpChar = MSG_SPACE
       else
       begin
         if CharPossible(lpChar) then lpS := lpS + lpChar;
       end;
     end;//while
    end;

  • Dmk © (03.04.16 21:51) [12]
    Там используется процедура FileExist64. Надеюсь сможешь сам реализовать?
    Для сведения: я вообще не программист.
  • chuxlo © (03.04.16 22:11) [13]
    Dmk! Сейчас буду разбираться с предложенным тобой. Ответ будет завтра.
  • Dmk © (03.04.16 22:28) [14]
    >с предложенным тобой
    Я ничего не предлагал. Просто поделился от доброты душевной.
  • chuxlo © (03.04.16 22:47) [15]
    Dmk! Проверил правда не весь код, а часть при помощи ShowMessage вывел
    lpComLine и получил только один файл, хотя передавал в программу выделенную группу.
  • Dmk © (03.04.16 23:17) [16]
    Как передавал? Куда? Код покажи.
  • chuxlo © (03.04.16 23:25) [17]
    В событии onShow формы
    ...
    var
    n:integer;
    begin
    for n:=1 to paramCount do
    listbox1.items.add(paramStr(n));
    end;
    ...
    В системе ассоциирую файлы mp3 с моей программой.Выделяю в Windows группу
    mp3 и открываю их.В результате моя программа выводит имя только одного файла.Как получить выделенную группу.
  • Dmk © (04.04.16 00:13) [18]
    Выкинь вариант Delphi. Он кривой.

    FilesList := TStringList.Create;
    ParseParamStr(FilesList);

    //Если есть строка параметров, то откроем файлы
    if FilesList.GetCount <> 0 then OpenMyFiles(FilesList);

    //Список больше не нужен
    FilesList.Free;



    В процедуре разборки строки замени AFiles.AddRecord(lpS); на FilesList.Add(lpS);
  • Dmk © (04.04.16 00:17) [19]
    Процедура FileExists:

    function FileExist64(FileName: string): boolean;
    var
     lpFD: _WIN32_FIND_DATAW;
     lpH: THandle;

    begin
     lpH := FindFirstFile(PWideChar(FileName), lpFD);

     if lpH = INVALID_HANDLE_VALUE then
       Result := False else
       Result := True;

     if Result then
     begin
       //Файл не должен быть директорией или устройством
       //Также не может быть скрыт
       if (lpFD.dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE) or
          (lpFD.dwFileAttributes = FILE_ATTRIBUTE_NORMAL) then else Result := False;
     end;

     WinApi.Windows.FindClose(lpH);
    end;

 
Конференция "WinAPI" » Командная строка
Есть новые Нет новых   [134427   +34][b:0][p:0.004]