![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Путь к файлу [XP]
Litestone © (2007-02-18 13:48:00)Здравствуйте, неподскажет ли кто нибудь как узнать путь к файлу, который запускает мою программу во время её работы.
Leonid Troyanovsky (2007-02-18 16:56:00) [21]
> RASkov (18.02.07 16:39) [11]
> Не мое, но вроде работает.
Вызывает сомнения FindWindow vs EnumWindows.
И связка с SendMessage.
Кроме того, не заметил SetForegroundWindow.
Т.е., пользователь пускает и пускает файлы,
а результатов не видит.
--
Regards, LVT.
RASkov (2007-02-18 16:39:00) [22]Второй вариант
Не мое, но вроде работает.
*.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:17:00) [23]
> Litestone (18.02.07 15:52) [9]
> Не могли бы вы подсказать, что неправельно.
В нем слишком много неправильного.
Так что, лучше испытать 1 способ, тем более,
что там есть весь необходимый код.
--
Regards, LVT.
Litestone (2007-02-18 15:52:00) [24]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 15:37:00) [25]
> Leonid Troyanovsky © (18.02.07 15:32) [7]
> - активирует окно ее приложения (SetForegroundWindow).
Ну и, затем завершается.
--
Regards, LVT.
Leonid Troyanovsky (2007-02-18 15:32:00) [26]
> RASkov (18.02.07 15:05) [6]
> ParamStr(n);
Или, с учетом "Начинающих":
запускаемая программа ищет окно своей раннее запущенной копии
(EnumWindows) и, если таковое (wnd: HWND) найдено:
- передает ему (SendMessage WM_COPYDATA свой ParamStr(1));
- активирует окно ее приложения (SetForegroundWindow).
--
Regards, LVT.
RASkov (2007-02-18 15:05:00) [27]> [4] Litestone (18.02.07 14:47)
ParamStr(n);
Leonid Troyanovsky (2007-02-18 14:57:00) [28]
> Litestone (18.02.07 14:47) [4]
> Winamp узнаёт путь файла который был запущен во время работы
См., например
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/278f89887ab26b31
--
Regards, LVT.
Litestone (2007-02-18 14:47:00) [29]Ладно, рассмотрим на примере Winamp.
1.Сделаем так чтобы при запуске любых mp3 файлов запускался Winamp.
2.Запустим Winamp.
3.Невыключая Winamp запустим какой-нибудь файл с разрешением mp3(в Playlist Winamp добавится этот файл,).
Winamp узнаёт путь файла который был запущен во время работы Winamp.
RASkov (2007-02-18 14:24:00) [30]> [2] Litestone (18.02.07 14:11)
Нет... помоему ты нифика не объяснил.... Я вот не понял - ни [0] ни твое объяснение[3].
Litestone (2007-02-18 14:11:00) [31]PA.exe - условное название моей программы.
1.Щёлкнуть правой кнопкой мыши на любом файле->открыть с
помощью->PA.exe
2.Запустить программу PA.exe.
3.Запустить тот файл к которому была присвоена PA.exe
(вот здесь PA.exe надо узнать путь файла, который запустил её второй раз во время её работы.).
vasIZmax (2007-02-18 13:56:00) [32]
> Litestone (18.02.07 13:48)
Я не понял. Это как: файлу, который запускает мою программу во времяё работы