Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизMDI Найти похожие ветки
← →
Erl (2005-10-29 15:23) [0]Добрый день.
Помошите пож. решить проблему.
Имеется приложение.
Оно прекрасно создает MDI детей, можно сохранять MDI в файл, читать его из файла. И, если приложение сущ. (проверка семафоров), то не нужно создавать его 2 копию, а загружать файл в сущ. приложение.
Вот как осуществить код создания MDICHILD в сущ. другом приложении?
Спасибо.
← →
Zeqfreed © (2005-10-29 15:28) [1]Erl (29.10.05 15:23)
Можно обрабатывать пользовательское сообщение и, если один экземпляр уже запущен, уведомлять его о необходимости загрузки файла посылкой этого сообщения. Передавать имя файла можно через файлы, отображенные в память.
← →
Zeqfreed © (2005-10-29 16:53) [2]Zeqfreed © (29.10.05 15:28) [1]
Написал небольшой пример, вроде работает :)program mafm;
uses
Windows,
Forms,
main in "main.pas" {Form1};
{$R *.res}
const
_MutexName = "152E3C3954A541B0AAD47B7E7AF6246E";
var
MutexObj : Cardinal;
begin
MutexObj := CreateMutex(nil, false, _MutexName);
if (GetLastError() = ERROR_ALREADY_EXISTS) then begin
ActivatePreviousInstance();
Exit;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
ReleaseMutex(MutexObj);
end.
* * *unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
_MapFileName = "SharedFileName";
_MessageName = "SharedOpenFileName";
type
TForm1 = class(TForm)
Memo1: TMemo;
private
procedure WndProc(var Msg : TMessage); override;
public
{ Public declarations }
end;
var
Form1: TForm1;
WM_OPENSHAREDFILENAME : Integer;
procedure ActivatePreviousInstance();
implementation
{$R *.dfm}
procedure TForm1.WndProc(var Msg : TMessage);
var
MapHandle : THandle;
MappedData : Pointer;
Data : PChar;
begin
if (Msg.Msg = WM_OPENSHAREDFILENAME) then begin
MapHandle := OpenFileMapping(PAGE_READONLY, false, _MapFileName);
MappedData := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, Msg.WParam);
if (MappedData = nil) then begin
CloseHandle(MapHandle);
RaiseLastWin32Error;
end else begin
Data := PChar(MappedData);
Memo1.Lines.LoadFromFile(Data);
SetForegroundWindow(Form1.Handle);
UnmapViewOfFile(MappedData);
CloseHandle(MapHandle);
end;
end else
inherited WndProc(Msg);
end;
procedure ShareData(const Str : PChar);
var
size : Integer;
MapHandle : THandle;
MappedData : Pointer;
Data : PChar;
begin
size := StrLen(Str);
MapHandle := CreateFileMapping(DWORD(-1), nil, PAGE_READWRITE, 0, size, _MapFileName);
if (MapHandle = 0) then RaiseLastWin32Error;
MappedData := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, size);
if (MappedData = nil) then
RaiseLastWin32Error()
else begin
StrCopy(PChar(MappedData), Str);
end;
SendMessage(HWND_BROADCAST, WM_OPENSHAREDFILENAME, size, 0);
end;
procedure ActivatePreviousInstance();
begin
if (ParamCount > 0) then
ShareData(PChar(ParamStr(1)));
end;
initialization
WM_OPENSHAREDFILENAME := RegisterWindowMessage(_MessageName);
end.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.05 c