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

Вниз

открытие файла на 1 копии программы   Найти похожие ветки 

 
Sele ©   (2006-08-06 16:00) [0]

Открываю файл при помощи моей проги
if (paramCount > 0) then
 begin
 str:=paramStr(1);
 for i:=2 to paramCount do
 begin
 str:=Str+" "+paramStr(i); и пошло дальше.
Если запускаю еще файл с помощью моей проги то запускается еще экземпляр  проги.
Как сделать так чтобы одновремеено мог быть запущен 1 экземпляр моей
проги и чтоб последущие файлы открывались в этом экземаляре.


 
Ketmar ©   (2006-08-06 16:30) [1]

проверять наличие уже запущеной программы и передавать ей файлы.


 
Sele ©   (2006-08-06 16:33) [2]

а как ей передать путь до файла запущенному экземпляру


 
Ketmar ©   (2006-08-06 16:52) [3]

любым удобным образом. например, использовать WM_COPYDATA.


 
Пусик ©   (2006-08-06 16:52) [4]


> Sele ©   (06.08.06 16:33) [2]
> а как ей передать путь до файла запущенному экземпляру


Первый вариант:
- в приложении создать обработчик сообщения WM_COPYDATA;
- при старте новой копии приложения передавать уже существующей в сообщении WM_COPYDATA строку с путем до файла;
- новую копию терминировать.

Второй вариант(проще):
- создать MMF(Memory Mapped File) при старте приложения;
- при старте новой копии открывать MMF и записыват путь до файла в MMF;
- посылкой Broadcast-message уведомлять первую копию о новом файле
- терминировать новую копию приложения


 
Sele ©   (2006-08-06 17:51) [5]

единственное что понял это терминовать приложение -)
А кодом не могли б помочь ?


 
KilkennyCat ©   (2006-08-06 18:05) [6]

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


 
Пусик ©   (2006-08-06 19:51) [7]


> Sele ©   (06.08.06 17:51) [5]


Файл проекта:

program Project1;

uses
WIndows,
Forms,
Unit1 in "Unit1.pas" {Form1};

var
H: THandle;
pView: Pointer;
NumMsg: DWORD;
p: Pointer;
HForm: THandle;
{$R *.res}

function DupApp: Boolean;
var
LenParm: DWORD;
s: String;
begin
Result := False;
H := CreateFileMappingA(INVALID_HANDLE_VALUE,nil,PAGE_READWRITE, 0, 1024, "MyProgram1");
if GetLastError=ERROR_ALREADY_EXISTS then Result := True;
pView := MapViewOfFile(H, FILE_MAP_ALL_ACCESS, 0, 0, 0);

s := ParamStr(1);
LenParm := Length(s);

p := pView;

if Result then
begin
 CopyMemory(@HForm, pView, SizeOf(DWORD));
 IncP(p);
 CopyMemory(@NumMsg, p, SizeOf(DWORD));
 IncP(p);
 CopyMemory(p,@LenParm,SizeOf(DWORD));
 IncP(p);
 CopyMemory(p,@s[1],LenParm);
 SendMessage(HForm,NumMsg,H,Integer(pView));
 UnMapViewOfFile(pView);
 CloseHandle(H);
 Exit;
end;
NumMsg := RegisterWindowMessage("MyMessage1MyProgram1");

IncP(p);
CopyMemory(p,@NumMsg,SizeOf(DWORD));
IncP(p);
CopyMemory(p,@LenParm,SizeOf(DWORD));
IncP(p);
CopyMemory(p,@s[1],LenParm);

end;

begin
if DupApp then Exit;
Application.Initialize;
Application.CreateForm(TForm1, Form1);

Form1.Tag := NumMsg;
HForm := Form1.Handle;
CopyMemory(pView,@HForm,SizeOf(DWORD));
SendMessage(HForm,NumMsg,H,Integer(pView));
Application.Run;
end.


Модуль главной формы:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls,CommCtrl;

type
TForm1 = class(TForm)
   Label1: TLabel;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 procedure FormCreate(Sender: TObject);
private
 H: THandle;
 pView: Pointer;
 procedure OnMsg(var Message: TMessage);
end;

var
Form1: TForm1;
H: THandle;
pView: Pointer;

procedure IncP(var p: Pointer);

implementation

{$R *.dfm}

procedure IncP(var p: Pointer);
begin
p := Pointer(Integer(p)+4);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 UnMapViewOfFile(pView);
 CloseHandle(H);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.WindowProc := OnMsg;
end;

procedure TForm1.OnMsg(var Message: TMessage);
var
LenParm: DWORD;
s: String;
begin
if Message.Msg=DWORD(Form1.Tag) then
begin
 H := Message.WParam;
 pView := Pointer(Message.LParam);
 IncP(pView);
 IncP(pView);
 CopyMemory(@LenParm,pView,SizeOf(DWORD));
 SetLength(s,LenParm);
 IncP(pView);
 CopyMemory(@s[1],pView,LenParm);
 Label1.Caption := "Переданный параметр:"+s;
end
else WndProc(Message);
end;

end.



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

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

Наверх




Память: 0.49 MB
Время: 0.055 c
2-1155058563
koha
2006-08-08 21:36
2006.08.27
Зацените прогу


6-1144309337
DVM
2006-04-06 11:42
2006.08.27
Как замедлить прием данных с сервера HTTP


2-1154929494
ph0sgen
2006-08-07 09:44
2006.08.27
Данные в EХЕ


4-1146934149
тт
2006-05-06 20:49
2006.08.27
Как узнать серийный номер ж.диска?


15-1153576090
vidiv
2006-07-22 17:48
2006.08.27
Эталон мужской красоты :)