Я хочу написать текстовый редактор и назначить ему файлы txt. Моя проблема в том, что я хочу запустить только один экземпляр и открыть новый файл, чтобы отправить имя файла в первое уже запущенное приложение ... (Я хочу сделать это с помощью мьютекса). Вот небольшой тестоткрытые текстовые файлы в одном приложении
DPR выглядит следующим образом
uses
Windows, Messages, SysUtils,
Forms,
wndMain in 'wndMain.pas' {frmMain};
{$R *.res}
var
PrevWindow : HWND;
S : string;
CData : TCopyDataStruct;
begin
PrevWindow := 0;
if OpenMutex(MUTEX_ALL_ACCESS, False, 'MyMutex') <> 0 then
begin
repeat
PrevWindow:=FindWindow('TfrmMain', nil);
until PrevWindow<>Application.Handle;
if IsWindow(PrevWindow) then
begin
SendMessage(PrevWindow, WM_SYSCOMMAND, SC_RESTORE, 0);
BringWindowToTop(PrevWindow);
SetForegroundWindow(PrevWindow);
if FileExists(ParamStr(1)) then
begin
S:=ParamStr(1);
CData.dwData:=0;
CData.lpData:=PChar(S);
CData.cbData:=1+Length(S);
SendMessage(PrevWindow, WM_COPYDATA, 0, DWORD(@CData));
end;
end;
end
else
CreateMutex(nil, False, 'MyMutex');
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
PAS:
type TfrmMain = class(TForm)
memo: TMemo;
private
procedure WMCopyData (var msg : TWMCopyData) ; message WM_COPYDATA;
public
procedure OpenFile(f : String);
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.WMCopyData (var msg : TWMCopyData) ;
var
f : String;
begin
f:=PChar(msg.CopyDataStruct.lpData);
//ShowMessage(f);
OpenFile(f);
end;
procedure TfrmMain.OpenFile(f : String);
begin
memo.Clear;
memo.Lines.LoadFromFile(f);
Caption:=f;
end;
этот код должен быть хорошо, но если я хочу, чтобы открыть текстовый файл (из второго приложения) , первое приложение получает сообщение, как это:
alt text http://img218.imageshack.us/img218/2175/errorjd.jpg
ТНА nks
Этот код мьютекса неправильный. Всегда используйте 'CreateMutex', а не' OpenMutex'. Кроме того, цикл 'FindWindow' бессмыслен. Эта функция вернет только дескриптор окна текущего приложения, если заголовок вашего приложения был «TfrmMain», но почему вы когда-либо называли свое приложение? Кроме того, если 'FindWindow' * делает * возвращает дескриптор окна вашего приложения, повторные вызовы не дают другого ответа, так что цикл будет выполняться ровно один раз или он будет работать вечно. –