Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.11.10;
Скачать: CL | DM;

Вниз

Открытие файла своей программой.   Найти похожие ветки 

 
vlad   (2013-02-07 14:44) [0]

Подскажите как отловить это момент в своей программе, чтобы выполнить нужные действие (Имеется введу "открыть с помощью" через правую кнопку мыши)


 
Медвежонок Пятачок ©   (2013-02-07 15:09) [1]

Как только тебя запустили - так значит момент этот и настал.


 
vlad   (2013-02-07 15:12) [2]


> Медвежонок Пятачок ©   (07.02.13 15:09) [1]


Это понятно. как это выглядет в программе?


 
Медвежонок Пятачок ©   (2013-02-07 15:13) [3]

Никак на выглядет.


 
Медвежонок Пятачок ©   (2013-02-07 15:14) [4]

Или выглядет так:
программа такая лежала леджала и вдруг ее запустили.
Она такая смотрит - ё! мне параметры в командной строке передали!
Етить колотить!


 
brother ©   (2013-02-07 15:21) [5]

программа запускается, создается ее главная форма, в ее OnCreate смотри, передали ли парамеры...


 
vlad   (2013-02-07 15:39) [6]


> brother ©   (07.02.13 15:21) [5]


Спасибо за подсказку. С одним файлом все понятно, а вот как быть если пытаться открыть сразу несколько файлов, в этом случае ParamCount все равно равен "1" (как в случае с MP3 плеером)


 
Ega23 ©   (2013-02-07 15:44) [7]


> Подскажите как отловить это момент в своей программе, чтобы
> выполнить нужные действие (Имеется введу "открыть с помощью"
> через правую кнопку мыши)

call notepat.exe test.txt


 
brother ©   (2013-02-07 15:46) [8]

http://www.cyberforum.ru/delphi/thread560198.html


 
Медвежонок Пятачок ©   (2013-02-07 15:50) [9]

а вот как быть если пытаться открыть сразу несколько файлов

Ты не поверишь!
Надо посмотреть что же там в этом параметре пришло.
Возможно там сразу несколько файлов.


 
vlad   (2013-02-07 15:58) [10]


> Медвежонок Пятачок ©   (07.02.13 15:50) [9]


Это возможно, а на самом деле там только первый.


> brother ©   (07.02.13 15:46) [8]



> Ega23 ©   (07.02.13 15:44) [7]


Это немного не то, я с вашей помощью разобрался что к чему.

Вопрос в том, что если выделено несколько файлов, то при "открыть с помошью" ParamCount все равно = 1, а ParamStr - содержит путь к только одному из файлов


 
vlad   (2013-02-07 15:59) [11]


> Надо посмотреть что же там в этом параметре пришло.

Ты сам смотрел?


 
Inovet ©   (2013-02-07 15:59) [12]

Ну или запустится несколько копий программы. При запуске проверять, есть ли уже запущенная и передавать ей параметр, самой завершаться. Это если именно такая логика нужна.


 
vlad   (2013-02-07 16:09) [13]


> Inovet ©   (07.02.13 15:59) [12]


Нет, ну вы извините, но вы не поняли вопрос - конечно понятно, что не хочется читать  всю ветку.


> Ну или запустится несколько копий программы.

Это вообще не то.

Копия только одна.

Действия такие:
1) заходим через проводник в папку
2) выделяем несколько файлов, (с одним файлом все работает)
3) через правую кнопку мыши ("открыть с помощье") открываем эти файлы через свою программу.

A ParamCount = 1, ParamStr - содержит ссылку только на один файл из выделенного набора.


 
Inovet ©   (2013-02-07 16:23) [14]

> [13] vlad   (07.02.13 16:09)

Всю читал. Открвть с помощью для нескольких файлов у меня нет, есть открыть, и открывается лоя txt несколько блокнотов.


 
Ega23 ©   (2013-02-07 16:23) [15]


> Вопрос в том, что если выделено несколько файлов, то при
> "открыть с помошью" ParamCount все равно = 1, а ParamStr
> - содержит путь к только одному из файлов


Я очень сильно подозреваю, что данном случае идёт передача нескольких файлов через "мультистринг" (или как там оно называется? Короче, когда есть буфер строк, каждая из которых оканчивается терминирующим нулём, а концом буфера служит ещё один терминирующий ноль).
Может Розыч поправит...


 
vlad   (2013-02-07 16:28) [16]


> Inovet ©   (07.02.13 16:23) [14]
>
> > [13] vlad   (07.02.13 16:09)
>
> Всю читал. Открвть с помощью для нескольких файлов у меня
> нет, есть открыть, и открывается лоя txt несколько блокнотов.
>


Ну это смотря кому какое поведение программы нужно - текстовые файлы можно открыть только в разных программах.
А вот, к примеру, набор MP3 файлов нужно открывать одной прогрммой, так чтобы они попали в список воспроизведение, а не открылся каждый одтельной копией MP3-плеера.


 
Inovet ©   (2013-02-07 16:29) [17]

> [15] Ega23 ©   (07.02.13 16:23)

Это какие-то неправильные параметры. Как из командной строки так сделать?


 
Ega23 ©   (2013-02-07 16:29) [18]

Розыч поправил, не так всё.
Если программа просто зарегистрирована под расширение (open a) и выбрано 10 файлов, то запустится 10 копий программы, каждая со своим.
Если программа зарегистрирована как ShellExtention, то тогда там унутре можно получить count файлов и дальше по индексу решать, что там с ними делать.


 
Inovet ©   (2013-02-07 16:29) [19]

> [16] vlad   (07.02.13 16:28)

На это я уже ответил.


 
sniknik ©   (2013-02-07 16:32) [20]

> набор MP3 файлов нужно открывать одной прогрммой, так чтобы они попали в список воспроизведение, а не открылся каждый одтельной копией MP3-плеера.
смотреть на параметр, если есть, и есть открытая копия, то посылать параметр ей, а самой закрываться...
не уверен, ни по моему они (плейры) так и делают...


 
vlad   (2013-02-07 17:09) [21]


> sniknik ©   (07.02.13 16:32) [20]


> не уверен, ни по моему они (плейры) так и делают...


Тот же Windows Media открывает все равно только один


 
брат Птибурдукова   (2013-02-07 17:23) [22]

Вот блин, хотел накатать злобный комментарий, а в [18] таки правильный вариант уже высказали.


 
Anatoly Pogoretsky   (2013-02-07 17:47) [23]

> vlad  (07.02.2013 16:09:13)  [13]

Если отмечено несколько
файлов то никакого
“открыть с помощью” не
будет.


 
vlad   (2013-02-07 17:49) [24]



а старую копию как закрывать?
begin
 HM := OpenMutex(MUTEX_ALL_ACCESS, false, "CdpApp");
 if (HM <> 0) then
 begin
   ShowMessage("Уже запушено");
  //КАК ЗДЕСЬ ЗАКРЫТЬ "СТАРУЮ КОПИЮ"
 end;

 if HM = 0 then
   HM := CreateMutex(nil, false, "CdpApp");
end;



 
brother ©   (2013-02-07 17:56) [25]

послать окну wm_close


 
vlad   (2013-02-07 18:07) [26]


> brother ©   (07.02.13 17:56) [25]

А окно старое как искать? через FindWindow?


 
brother ©   (2013-02-07 18:17) [27]

найми программиста...


 
vlad   (2013-02-07 18:46) [28]


> brother ©   (07.02.13 18:17) [27]
>
> найми программиста...


Хоть нанимай, хоть нет. Кроме как FindWindow, метода я не знаю.
Но так можно закрыть не то что надо.


 HM := OpenMutex(MUTEX_ALL_ACCESS, false, "CdpApp");
 if (HM <> 0) then
 begin
   SendMessage((FindWindow(nil, "MyProgram")), WM_CLOSE, 0, 0);
   //ShowMessage("Уже запущено");
 end;


 
Rouse_ ©   (2013-02-07 19:35) [29]


> vlad   (07.02.13 17:49) [24]
> а старую копию как закрывать?

Если ты работаешь без ShellExt то старую копию закрывать не нужно. Нужно найти текущий экземпляр программы и ему отправить уведомление о том что нужно обработать новый файл, после чего завершить свой процесс.

Вариантов поиска оригинального экземпляра ну просто море,
на вскидку некий уникальный класс окна который будет в единственном экземпляре на всю систему + FindWindow или именованный MMF в котором прописан хэндл окна принимающий уведомления от чужих процессов.
В обоих случаях SendMessage + WM_COPYDATA где и передаем данные.
Еще вариант - именованные каналы (пайпы), через которые так же можно перегнать данные.
Да и вообще вариантов на коленке можно целую кучу накидать.


 
Rouse_ ©   (2013-02-07 19:39) [30]

ЗЫ: но лучше, если предполагается постоянно работать с большим списком открываемых файлов (тот же плеер), крайне желательно реализовать собственное расширение оболочки.

Старт сотни процессов только для того чтобы передать главному экземпляру некие данные - ни разу не легкая прогулка для системы и тормоза могут наблюдаться даже на достаточно производительных машинах.


 
Плохиш ©   (2013-02-07 19:42) [31]


> vlad   (07.02.13 17:49) [24]
> а старую копию как закрывать?

Надо в старую передать полученый файл и новый экземпляр программы закрыть.

А так поддерживаю совет о найме программиста.


 
Плохиш ©   (2013-02-07 19:46) [32]


> Anatoly Pogoretsky   (07.02.13 17:47) [23]
> > vlad  (07.02.2013 16:09:13)  [13]
>
> Если отмечено несколько
> файлов то никакого
> “открыть с помощью” не
> будет.

А ведь действительно...


 
Rouse_ ©   (2013-02-07 19:53) [33]


> Плохиш ©   (07.02.13 19:46) [32]
> А ведь действительно...

Угу, и Enter в жесткую блокируется :))


 
Inovet ©   (2013-02-07 21:27) [34]

> [24] vlad   (07.02.13 17:49)
> а старую копию как закрывать?

Тебе 2 (два) раза сказали - закрывать новую. Писатель не читатель?


 
Inovet ©   (2013-02-07 21:29) [35]

> [29] Rouse_ ©   (07.02.13 19:35)

Уже 4 раза сказали.


 
Inovet ©   (2013-02-07 21:31) [36]

> [31] Плохиш ©   (07.02.13 19:42)

5 раз. Теперь дойдёт.


 
Inovet ©   (2013-02-07 21:33) [37]

> [32] Плохиш ©   (07.02.13 19:46)
> А ведь действительно...

В общем так: или автор не читает сообщения, или темнит, или что-то ещё, не буден это называть.


 
имя   (2013-02-07 21:47) [38]

Удалено модератором


 
Rouse_ ©   (2013-02-07 22:03) [39]


> Inovet ©   (07.02.13 21:29) [35]
> Уже 4 раза сказали.

Лучше 1 раз разжевать, чем 4 раз рассказать :)


 
имя   (2013-02-07 22:07) [40]

Удалено модератором
Примечание: может лучше сразу бан по IP, как думаешь?


 
brother ©   (2013-02-08 04:15) [41]

чтож всех на скрытность то тянет?
мои наброски, разбирайся!
function TProgramForm.SafeRemoval(drive: char): boolean;
var
 sh : SHFILEOPSTRUCT;

 FreeBytesAvailableToCaller: TLargeInteger;
 FreeSize: TLargeInteger;
 TotalSize: TLargeInteger;

 f: file;
 NumWritten: Integer;
 Buf: pointer;
 bufSize: Integer;
 BytesWrite: TLargeInteger;
begin
 result:= False;
 StopSafeRemoval:= False;

//  ShowMessage("Удаление всего содержимого диска, это может занять длительное время, ждите...");

 // Удаляем ВСЕ содержимое с устройства!
 AddLog("Удаление всего содержимого диска, ждите...");
 sh.Wnd := Application.Handle;
 sh.wFunc := FO_DELETE;
 sh.pFrom := PAnsiChar(drive + ":\*.*");
 sh.pTo := nil;
 sh.fFlags := FOF_NOCONFIRMATION + FOF_SILENT+ FOF_NOERRORUI;
 sh.fAnyOperationsAborted := False;
 sh.hNameMappings := nil;
 sh.lpszProgressTitle := nil;
 if SHFileOperation(sh) <> 0 then
 begin
  AddLog("Не удалось(файлы/папки заняты другим приложением?)");
  //Exit;
 end
 else
   AddLog("Ok");

 // узнаем кол-во свободного места на диске
 if not GetDiskFreeSpaceEx(PChar(drive + ":\"), FreeBytesAvailableToCaller, Totalsize, @FreeSize) then
 begin
   AddLog("Ошибка получения свободного места: " + GetLastErrorText);
   exit;
 end
 else
   AddLog("Свободное место на диске: " + IntToStr(FreeBytesAvailableToCaller) + " байт");

//  FreeBytesAvailableToCaller:= {1073741824;} 2147483648;

 // Создаем файл с пустым содержимым по размеру всего диска
 AddLog("Создание временного файла, ждите...");
 BufSize := 1048576; // 1МБ
 GetMem(buf, BufSize);
 //Gauge1.MaxValue:= FreeBytesAvailableToCaller;
 BytesWrite:= 0;
 try
   assignfile(f, drive + ":\tmp.$$$");
   rewrite(f, 1);
   while (BytesWrite+bufSize <= FreeBytesAvailableToCaller) and (not StopSafeRemoval) do
   begin
     BlockWrite(f, Buf^, BufSize, NumWritten);
     Inc(BytesWrite, NumWritten);
//      Gauge1.Progress:= BytesWrite;
     application.ProcessMessages;
   end;
 except
   FreeMem(Buf);
   CloseFile(f);
 end;
 if StopSafeRemoval then
 begin
   AddLog("Отменено пользователем!");
   FreeMem(Buf);
   CloseFile(f);
   Exit;
 end;
 // если в конце не дозаписан хвост меньше bufSize дозапишем его
 if BytesWrite < FreeBytesAvailableToCaller then
 begin
   BufSize := FreeBytesAvailableToCaller-BytesWrite;
   FreeMem(Buf);
   GetMem(buf, BufSize);
   BlockWrite(f, Buf^, BufSize, NumWritten);
 end;
 FreeMem(Buf);
 CloseFile(f);

 AddLog("Ok");

{  if DeleteFile(drive + ":\tmp.$$$") then
   AddLog("Временный файл успешно удален")
 else
 begin
   AddLog("Ошибка удаления временного файла");
   exit;
 end;}

 result:= True;
end;


 
brother ©   (2013-02-08 04:18) [42]

упс, промахнулся топиком)


 
vlad   (2013-02-08 12:23) [43]


> Rouse_ ©   (07.02.13 22:03) [39]
>
>
> > Inovet ©   (07.02.13 21:29) [35]
> > Уже 4 раза сказали.
>
> Лучше 1 раз разжевать, чем 4 раз рассказать :)


Так уж сложилось, что нужно именно закрывать старую копию, а не передавать в старую копию новые параметры

Один момент не понятен и все(

procedure TMyForm.FormCreate(Sender: TObject);
begin
 //почему эта команда не закрывает старую копию?
 SendMessage(FindWindow(nil, "MyProgram"), WM_CLOSE, 1, 0);
 //а эта работает без проблем?
 SendMessage(FindWindow(nil, "Диспетчер задач Windows"), WM_CLOSE, 1, 0);
end;


 
Ega23 ©   (2013-02-08 12:39) [44]


> Так уж сложилось, что нужно именно закрывать старую копию,
>  а не передавать в старую копию новые параметры


Просто любопытно: а почему? Почему не передать новые данные в старую копию, с расчётом на то, что она бросит текущие данные и займётся новыми?


 
vlad   (2013-02-08 12:42) [45]


> Ega23 ©   (08.02.13 12:39) [44]


ну а почему бы не закрыть старую?


 
Rouse_ ©   (2013-02-08 12:49) [46]

Ну закроешь ты старую, а смысл?


 
vlad   (2013-02-08 12:54) [47]


> Rouse_ ©   (08.02.13 12:49) [46]
>
> Ну закроешь ты старую, а смысл?


Да в тот то и дело что не закрою.
A где грабли не пойму:
procedure TMyForm.FormCreate(Sender: TObject);
begin
//почему эта команда не закрывает старую копию?
SendMessage(FindWindow(nil, "MyProgram"), WM_CLOSE, 1, 0);
//а эта работает без проблем?
SendMessage(FindWindow(nil, "Диспетчер задач Windows"), WM_CLOSE, 1, 0);
end;


Ну нужно так и все.


> > brother ©   (07.02.13 18:17) [27]
> >
> > найми программиста...


Ребята дорогие, я специально написал в раздел "начинающим".


 
Ega23 ©   (2013-02-08 13:00) [48]


> ну а почему бы не закрыть старую?

Т.е. принципиальных причин нет, я правильно понял?
Почему плохо закрывать старую:
Во-первых, ты её найти не можешь... :)))    (шутка)
Во-вторых, вот она что-то там такое делает, шуршит вовсю, пердит-пыхтит, старается. И будет так ещё пердеть-пыхтеть, например, час. А тут её - фигак, и топором рубят. Не айс.


 
vlad   (2013-02-08 13:04) [49]


> Во-первых, ты её найти не можешь... :)))    (шутка)


Диспетчер задач значит находит, а свою копию найти не может.


> Во-вторых, вот она что-то там такое делает, шуршит вовсю,
>  пердит-пыхтит, старается. И будет так ещё пердеть-пыхтеть,
>  например, час. А тут её - фигак, и топором рубят. Не айс.
>


Да черт с ней.


 
Ega23 ©   (2013-02-08 13:23) [50]


> Диспетчер задач значит находит, а свою копию найти не может.

Тебя предупреждали. А ты не слушаешь.
Ненаказуемо, но "будет путь его тернистый долог".


 
Anatoly Podgoretsky ©   (2013-02-08 14:45) [51]


> упс, промахнулся топиком)

Стреляй из лука


 
брат Птибурдукова   (2013-02-08 14:54) [52]


> фигак, и топором рубят
WM_CLOSE — таки мелковато для топора :-)


 
Плохиш ©   (2013-02-09 23:31) [53]


> vlad   (08.02.13 13:04) [49]

Закрыть старую копию ничем не отличается от передать в неё чего-то. Решений в мировой помойке сколько угодно, даже для копи/паста, даже на этом форуме можно найти несколько тем. Но учитывая, что обсуждение перевалило за полсотни, программиста нанять будет безопасней и дешевле.



Страницы: 1 2 вся ветка

Текущий архив: 2013.11.10;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.009 c
6-1269926058
alekseyi
2010-03-30 09:14
2013.11.10
TClientSocket 10022 Error


15-1369476584
Новичок
2013-05-25 14:09
2013.11.10
Язык программирования для ИИ.


15-1368820513
Knight
2013-05-17 23:55
2013.11.10
Usb-флоповод - убивец данных


2-1360436617
Wadimka
2013-02-09 23:03
2013.11.10
Подскажите как получить список всех компонетов


15-1369256090
картман
2013-05-23 00:54
2013.11.10
неправильный вирус