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

Вниз

Путь к файлу   Найти похожие ветки 

 
Litestone   (2007-02-18 13:48) [0]

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


 
vasIZmax ©   (2007-02-18 13:56) [1]


> Litestone   (18.02.07 13:48)  

Я не понял. Это как:файлу, который запускает мою программу во время ё работы


 
Litestone   (2007-02-18 14:11) [2]

PA.exe - условное название моей программы.

1.Щёлкнуть правой кнопкой мыши на любом файле->открыть с
помощью->PA.exe

2.Запустить программу PA.exe.

3.Запустить тот файл к которому была присвоена PA.exe
(вот здесь PA.exe надо узнать путь файла, который запустил её второй раз во время её работы.).


 
RASkov   (2007-02-18 14:24) [3]

> [2] Litestone   (18.02.07 14:11)

Нет... помоему ты нифика не объяснил.... Я вот не понял - ни [0] ни твое объяснение[3].


 
Litestone   (2007-02-18 14:47) [4]

Ладно, рассмотрим на примере Winamp.

1.Сделаем так чтобы при запуске любых mp3 файлов запускался Winamp.

2.Запустим Winamp.

3.Невыключая Winamp запустим какой-нибудь файл с разрешением mp3(в Playlist Winamp добавится этот файл,).

Winamp узнаёт путь файла который был запущен во время работы Winamp.


 
Leonid Troyanovsky ©   (2007-02-18 14:57) [5]


> Litestone   (18.02.07 14:47) [4]

> Winamp узнаёт путь файла который был запущен во время работы

См., например

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/278f89887ab26b31

--
Regards, LVT.


 
RASkov   (2007-02-18 15:05) [6]

> [4] Litestone   (18.02.07 14:47)

ParamStr(n);


 
Leonid Troyanovsky ©   (2007-02-18 15:32) [7]


> RASkov   (18.02.07 15:05) [6]

> ParamStr(n);

Или, с учетом "Начинающих":
запускаемая программа ищет окно своей раннее запущенной копии
(EnumWindows) и, если таковое (wnd: HWND) найдено:
- передает ему (SendMessage WM_COPYDATA свой ParamStr(1));
- активирует окно ее приложения (SetForegroundWindow).

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-02-18 15:37) [8]


> Leonid Troyanovsky ©   (18.02.07 15:32) [7]

> - активирует окно ее приложения (SetForegroundWindow).

Ну и, затем завершается.

--
Regards, LVT.


 
Litestone   (2007-02-18 15:52) [9]

Leonid Troyanovsky я решил попробовать второй способ, но у меня он не стал работать(код снизу).

Не могли бы вы подсказать, что неправельно.

procedure TfrmMain.FormCreate(Sender: TObject);

if EnumWindows(0,Handle)
then SendMessage(Handle,WM_COPYDATA,0,0);

end;

procedure TfrmMain.AEventsIdle(Sender: TObject; var Done: Boolean);
var S:string;
begin

if Paramstr(1)<>""
then s:=Paramstr(1);

end;


 
Leonid Troyanovsky ©   (2007-02-18 16:17) [10]


> Litestone   (18.02.07 15:52) [9]

> Не могли бы вы подсказать, что неправельно.


В нем слишком много неправильного.
Так что, лучше испытать 1 способ, тем более,
что там есть весь необходимый код.

--
Regards, LVT.


 
RASkov   (2007-02-18 16:39) [11]

Второй вариант
Не мое, но вроде работает.
*.dpr
____________________________________________________________________
var
 i: integer;
 hMainForm: hwnd;
 copyDataStruct: TCopyDataStruct;
 ParamString: string;
 WParam, LParam: integer;
begin
 // ищем главное окно приложения, вместо Caption - nil,
 // поскольку заголовок главного окна может изменится
 // (нужно позаботиться об уникальности имени класса главной формы)

 hMainForm := FindWindow("TForm1", nil);
 if hMainForm = 0 then
 begin
   Application.Initialize;
   Application.CreateForm(TForm1, Form1);
   for i := 1 to ParamCount do
     TForm1(Application.MainForm).MyOpenFile(ParamStr(i));
   Application.Run;
 end
 else
 begin
   ParamString := "";
   for i := 1 to ParamCount do
   begin
     // запихиваем все параметры в одну строку с разделителями #13

     ParamString := ParamString + ParamStr(i) + #13;
   end;
   // создаем запись типа TCopyDataStruct

   CopyDataStruct.lpData := PChar(ParamString);
   CopyDataStruct.cbData := Length(ParamString);
   CopyDataStruct.dwData := 0;
   WParam := Application.Handle;
   LParam := Integer(@CopyDataStruct);
   // отсылаем сообщение WM_COPYDATA главному окну открытого приложения

   SendMessage(hMainForm, WM_CopyData, WParam, LParam);
   Application.Terminate;
 end;
end.


*.pas {главная форма}
____________________________________________________________________________
 TForm1 = class(TForm)
......
   procedure CopyData(var Msg: TWMCopyData); message WM_COPYDATA;
 private
   { Private declarations }
 public
   procedure MyOpenFile(const S: String);
   { Public declarations }
 end;
..........
procedure TForm1.MyOpenFile(const S: String);
begin
 {}
end;

procedure TForm1.CopyData(var Msg: TWMCopyData);
var
 ParamStr: string;
 CopyDataStructure: TCopyDataStruct;
 i: integer;
 len: integer;
begin

 CopyDataStructure := Msg.CopyDataStruct^;
 ParamStr := "";
 len := CopyDataStructure.cbData;
 for i := 0 to len - 1 do
 begin
   ParamStr := ParamStr + (PChar(CopyDataStructure.lpData) + i)^;
 end;

 i := 0;
 while not (Length(ParamStr) = 0) do
 begin
   if isDelimiter(#13, ParamStr, i) then
   begin
     MyOpenFile(Copy(ParamStr, 0, i - 1));
     ParamStr := Copy(ParamStr, i + 1, Length(ParamStr) - i - 1);
   end;
   inc(i);
 end;
 inherited;
end;


 
Leonid Troyanovsky ©   (2007-02-18 16:56) [12]


> RASkov   (18.02.07 16:39) [11]

> Не мое, но вроде работает.

Вызывает сомнения FindWindow vs EnumWindows.
И связка с SendMessage.

Кроме того, не заметил SetForegroundWindow.
Т.е., пользователь пускает и пускает файлы,
а результатов не видит.

--
Regards, LVT.


 
RASkov   (2007-02-18 17:01) [13]

> Т.е., пользователь пускает и пускает файлы,
> а результатов не видит.

Что верно, то верно.... но я же несобирался полностью писать автору программу. В общих чертах понятно, далее если, что у него не получится пусть спрашивает, поможем.... Более того, он(автор) может остановится на первом варианте...


 
Leonid Troyanovsky ©   (2007-02-18 17:43) [14]


> RASkov   (18.02.07 17:01) [13]

> Что верно, то верно.... но я же несобирался полностью писать
> автору программу.

Дык, и мой комментарий адресован, скажем, не только автору.

--
Regards, LVT.


 
RASkov   (2007-02-18 17:50) [15]

> [14] Leonid Troyanovsky ©   (18.02.07 17:43)

Ладно, уговорил :)
>Автор не пользуйся моим вариантом, по моей лени, я не стал его переделывать для твоих целей, и посему он тебе не подойдет. чесно.
:)
ЗЫ ОФФТОП


 
Litestone   (2007-02-18 18:17) [16]

Почему, всё отлично работает ?:)


 
RASkov   (2007-02-18 18:28) [17]

> [16] Litestone   (18.02.07 18:17)

Просто интересно - на каком варианте остановился?
Дело в том, что как и правильно замечено в [12], в моем варианте нет активизации формы при получении данных. И работает только если в делфи не загружен "этот" проект.


 
RASkov   (2007-02-18 18:33) [18]

> [16] Litestone   (18.02.07 18:17)

Вот заполню пробел...по активации :)

procedure TForm1.CopyData(var Msg: TWMCopyData);
.....
begin
 CopyDataStructure := Msg.CopyDataStruct^;
.......
 Application.Restore;
 Application.BringToFront;

 inherited;
end;


 
Leonid Troyanovsky ©   (2007-02-18 18:53) [19]


> RASkov   (18.02.07 18:33) [18]

> Вот заполню пробел...по активации :)


Не, так нельзя.
Т.е., SetForegroundWindow должно делать то приложение,
которое в настоящий момент foreground.
А таким является запускаемое, т.к. оно пускается юзером
(из проводника, cmd & etc).

--
Regards, LVT.


 
Litestone   (2007-02-18 18:54) [20]

Первый вариант у меня  не работал вообще хотя весь код я написал    
полностью, поэтому я и решил остановиться на втором.

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

И вообще громадное спасибо всем !!!!!


 
Leonid Troyanovsky ©   (2007-02-18 20:50) [21]


> Litestone   (18.02.07 18:54) [20]

> Первый вариант у меня  не работал вообще хотя весь код я

Вообще-то, мы здесь стараемся учиться на чужих ошибках,
поэтому для меня, например, было б весьма интересно узнать,
что именно не работало. Потому, как до сих пор, этот код
считался вполне работоспособным.

Если не затруднит - нерабочий код в студию.
С указанием ОС и других интимностей.

--
Regards, LVT.


 
Litestone   (2007-02-19 11:51) [22]

Oперационная система XP SP2

Delphi 2006

Да и к тому же в статье было написано "DDE - вымирающий зверь, и, наверное, последний ему заповедник - взаимодействие приложения с Explorer" может поэтому? Сам незнаю код написан, а не работает.

Хотя есть ещё одна особенность uses Ddeml; пришлось писать после Implementation.


 
Litestone   (2007-02-19 12:00) [23]

Да и ещё забыл сказать что мне пришлось найти в папке с Delphi Файл Ddeml.pas и вставить его в папку с проектом.


 
Leonid Troyanovsky ©   (2007-02-19 13:40) [24]


> Litestone   (19.02.07 11:51) [22]

> Oперационная система XP SP2
> Delphi 2006

Не знаю на моем w2k3 все нормально, вот только что испытал.

> Да и к тому же в статье было написано "DDE - вымирающий
> зверь, и, наверное, последний ему заповедник - взаимодействие

Ну, так Explorer продолжает понимать DDE.

> приложения с Explorer" может поэтому? Сам незнаю код написан,
>  а не работает.

Мне неудобно спрашивать, но:
- Выполнялся ли реестровый скрипт .reg ?
- Соответствуют ли путь к exe с описанным в нем?
- Чего, вообще, написано в HCR\.myfile и HCR\myfile ?

Проверь, если не влом, а то неохота идти на машину с XP.
Все ж, надо довести исследование до конца.

> Хотя есть ещё одна особенность uses Ddeml; пришлось писать
> после Implementation.

Ну, да, Майкл привел, как раз, раздел implementation.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-02-19 13:43) [25]


> Litestone   (19.02.07 12:00) [23]

> Да и ещё забыл сказать что мне пришлось найти в папке с
> Delphi Файл Ddeml.pas и вставить его в папку с проектом.

Может он не лежит на путях поиска.

--
Regards, LVT.


 
Litestone   (2007-02-19 15:44) [26]

Похоже эта тайна останется неразгаданной...


 
RASkov   (2007-02-19 16:16) [27]

> Может он не лежит на путях поиска.

"Может" - не нужен, дабы если б он лежал на путях, то его бы непременно раздавили, т.е. нашли....

> [26] Litestone   (19.02.07 15:44)

Первый способ тоже работает, только, что проверил (Win XP SP2, D7)
И мне практически ничего менять не пришлось, добавил у формы два события Create и Destroy, на форму Memo1, раздел implementation полность и как есть скоприровал со статьи по ссылке, подправил *.reg, импортировал, скомпилил и положил exe"шник по пути из *.reg - далее создал файл 123.myfile и ... все нормально, но...
мне кажется для автора вопроса более подходит второй вариант, или нужно дорабатывать первый - Обработку при передаче через параметр (просто "перетаскиванием" файла .myfile на значок программы, запускается еще одна копия).
Вообщем-то вариант Leonid Troyanovsky [5] рабочий.


 
RASkov   (2007-02-19 16:24) [28]

> надо узнать путь файла, который запустил её второй раз во время её работы.).


> Winamp узнаёт путь файла который был запущен во время работы Winamp


> запускаемая программа ищет окно своей раннее запущенной копии

Кстати с вариантом DDE этого непроисходит, т.е. нет никакой второй копии, работа только с одним экземпляром программы.


 
Leonid Troyanovsky ©   (2007-02-20 00:18) [29]


> RASkov   (19.02.07 16:16) [27]


> "Может" - не нужен, дабы если б он лежал на путях, то его
> бы непременно раздавили, т.е. нашли....

Принимается.

> Первый способ тоже работает, только, что проверил (Win XP
> SP2, D7)
> И мне практически ничего менять не пришлось, добавил у формы
> два события Create и Destroy, на форму Memo1, раздел implementation
> полность и как есть скоприровал со статьи по ссылке, подправил
> *.reg, импортировал, скомпилил и положил exe"шник по пути
> из *.reg - далее создал файл 123.myfile и ... все нормально,

Спасибо, все стало более понятным.

>  но...
> мне кажется для автора вопроса более подходит второй вариант,
>  или нужно дорабатывать первый - Обработку при передаче
> через параметр (просто "перетаскиванием" файла .myfile на
> значок программы, запускается еще одна копия).
> Вообщем-то вариант Leonid Troyanovsky [5] рабочий.

Вообще-то, это вариант Майкла. Или, если угодно, Михаэля,
бо, все же он германец, IMHO.
По поводу значка - постараюсь разобраться завтра.

> Кстати с вариантом DDE этого непроисходит, т.е. нет никакой
> второй копии, работа только с одним экземпляром программы.

Не уверен. Но, кажется, что, все же, копия отрабатывает.
Неохота исходники Windows изучать (мне их еще найти их надо).

--
Regards, LVT.


 
RASkov   (2007-02-20 00:31) [30]

> Не уверен. Но, кажется, что, все же, копия отрабатывает.
> Неохота исходники Windows изучать (мне их еще найти их надо)
> .

Как там может показаться, что работает код на OnCreate, т.е. я про вторую копию, я для проверки убрал из метода Create формы все и перенес на ButtonClick; После старта программы если не нажимая сначала кнопку попытаться "запустить" файл *.myfie система ругается, что не найден файл зарегистрированный для открытия *.myfile. После нажатия кнопки (выполнения бывшего OnCreate) все встает на свои места....
Всеж DDE оно и в африке DDE. Мы ж DDE сервер регистрируем и тем самым OS работает с одной копией программы.... имхо.


 
RASkov   (2007-02-20 00:42) [31]

> По поводу значка - постараюсь разобраться завтра.

(> просто "перетаскиванием" файла .myfile на
> значок программы, запускается еще одна копия)

Значок - имелось ввиду <Project>.exe в проводнике Windows....
так, для ясности...на всяк.


 
Leonid Troyanovsky ©   (2007-02-20 21:29) [32]


> RASkov   (20.02.07 00:31) [30]

> и тем самым OS работает с одной копией программы.... имхо.

Да, пожалуй, что оно так и есть.


> RASkov   (20.02.07 00:42) [31]

> (> просто "перетаскиванием" файла .myfile на
> > значок программы, запускается еще одна копия)


Да уж.
Не знаю, предусмотрено ли искомое взаимодействие проводника
с запускаемым. Хотя, сама тема не возбуждает, бо то, что когда-то
попадалось на глаза из SDK Explorer with DDE вызывало тоску.
Врядли сейчас что-то улучшилось.

Возможно, что, в самом деле, стоит послать всю эту ddeml
и изготовить требуемые грабли собс-ручно.
С учетом, конечно, требований [7] - там нет ничего лишнего,
чесслово.

--
Regards, LVT.



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

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

Наверх




Память: 0.56 MB
Время: 0.04 c
2-1172047781
webpauk
2007-02-21 11:49
2007.03.11
Сообщение для Timage


2-1171473737
Washington
2007-02-14 20:22
2007.03.11
ADOQuery и INI-файлы


6-1159912290
Scar89
2006-10-04 01:51
2007.03.11
Отправка смс


15-1171214336
Веталь
2007-02-11 20:18
2007.03.11
А драйвера полностью грузятся в память?


15-1171602255
Думкин
2007-02-16 08:04
2007.03.11
Как надо сдавать зачеты. :)