Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Путь к файлу [XP]


Страницы:   1 2

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)  

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо