Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1154808578
alexsashka
2006-08-06 00:09
2006.08.27
смена строк в ListBox


2-1154607978
DProject
2006-08-03 16:26
2006.08.27
Открыть два проекта одновременно


15-1154429606
Сергей М.
2006-08-01 14:53
2006.08.27
Win32-дебагер для Win16-приложений


1-1152888285
Andrey Molchanov
2006-07-14 18:44
2006.08.27
Загрузить иконку определенной цветности


15-1153207818
novoalex
2006-07-18 11:30
2006.08.27
FreeBSD





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский