Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Внизоткрытие файла на 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.045 c