Форум: "Начинающим";
Текущий архив: 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.55 MB
Время: 0.042 c