Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.04 c
8-1152164194
Нуждающийся
2006-07-06 09:36
2007.03.11
Выбор устройства для записи


2-1172056346
Sapos
2007-02-21 14:12
2007.03.11
DBNavigator


15-1171646175
GanibalLector
2007-02-16 20:16
2007.03.11
ICQ...AOL "режет" подключения с одного IP


8-1147019307
Константинов
2006-05-07 20:28
2007.03.11
WaveOut


15-1171353990
xayam
2007-02-13 11:06
2007.03.11
Правильное завершение программы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский