-
В программе нужно принимать параметры командной строки.В цикле используя paramCount считываю значения переменных (ParamStr(n)).При запуске из Delphi заполнив строку параметров все их получаю в программе.При запуске в реале (т.е ассоциирую свою программу с mp3 файлами) выделяю группу файлов и передаю в программу
в программе получаю в параметрах только один файл.Куда копать?
-
Лично я в таком случае получаю несколько экземпляров приложения, ассоциированного с расширением. В каждый экземпляр передаётся один файл. А потом уже можно будет собрать файлы в одном экземпляре.
-
Не думаю, что это выход.Если в каталоге несколько десятков файлов, мне необ-
ходимо будет несколько десятков экземпляров программы ассоциированых с необходимым типом файлов.
-
> Не думаю, что это выход
Венда поступает именно так - она открывает несколько экземпляров.
-
Хорошо буду думать в этом направлении.Но неужели при выделении 50 mp3 откры
вается 50 экземпляров WinAmp
-
Проводник запускает несколько программ.
В каждой программе передаётся по оному файлу. Ваш код создаёт именованный мьютекс. Мьютекс создаёт тот кто первый запустился остальные проверяют есть он или нет. Если нет то он первый.
Если есть используем межпроцессный обмен данными IPC. Наиболее популярным является через проецируемый файл. Но в вашем случае почтовый ящик лучше подойдёт.
https://ru.wikipedia.org/wiki/Межпроцессное_взаимодействиеПередаём через этот ящик в главную программу свои параметры.
Далее когда получено подтверждение получения. Лишние копии закрываются остается только первая, она же основная.
И учтите что при создании мьютекса есть ряд особенносий описанных в примечаниях.
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682411(v=vs.85).aspx
-
Благодарю Pavia.Есть информация буду пережевывать.
-
Что за .... Процедура парсинга командной строки пишется за час с отладкой. Максимум 2-3 для новичка. Какие мютексы?!?!?
-
-
>Leonid Troyanovsky © (03.04.16 09:56) [8]
Да понятно. Просто непонятно что сложного в разборе строки состоящей из двойных и одинарных скобок. Я бы выложил, но не хочется халяву разводить. Там головой подумать час времени максимум. У меня 100+ файлов открывается без проблем, хоть с командной строки, хоть с WM_DROPFILES.
-
Dmk ! Проблема не в том, что я не могу разобрать командную строку.Вместо группы выделенных файлов я получаю один-разбирать нечего.
-
>
[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;
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;
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
else
begin
if CharPossible(lpChar) then lpS := lpS + lpChar;
end;
end;
end;
-
Там используется процедура FileExist64. Надеюсь сможешь сам реализовать?
Для сведения: я вообще не программист.
-
Dmk! Сейчас буду разбираться с предложенным тобой. Ответ будет завтра.
-
>с предложенным тобой
Я ничего не предлагал. Просто поделился от доброты душевной.
-
Dmk! Проверил правда не весь код, а часть при помощи ShowMessage вывел
lpComLine и получил только один файл, хотя передавал в программу выделенную группу.
-
Как передавал? Куда? Код покажи.
-
В событии onShow формы
...
var
n:integer;
begin
for n:=1 to paramCount do
listbox1.items.add(paramStr(n));
end;
...
В системе ассоциирую файлы mp3 с моей программой.Выделяю в Windows группу
mp3 и открываю их.В результате моя программа выводит имя только одного файла.Как получить выделенную группу.
-
Выкинь вариант Delphi. Он кривой.
FilesList := TStringList.Create;
ParseParamStr(FilesList);
if FilesList.GetCount <> 0 then OpenMyFiles(FilesList);
FilesList.Free;
В процедуре разборки строки замени AFiles.AddRecord(lpS); на FilesList.Add(lpS);
-
Процедура 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;
-
У меня просто для списка фалов свой класс написан. Там параметров больше.
Замени мой класс на TStringList и все. Будет тебе счастье.
-
Dmk! Сейчас буду пробовать. Ответ будет завтра.Благодарю Dmk за участие в теме.
-
правильный ответ в [8], так работает в часности сама дельфя
дмк вообще не понял о чем речь, не трать на него время