Пишу программку, которая должна быть без формы.
Она должна добавлять в список (StringList) подкладываемых ей параметров.
А при повторном запуске она должна передать этот параметр первой запущенной копии и закрыться.
Однако то ли PostMessage то ли PeekMessage не срабатывают. Что я не так делаю?
program ApplicationsAgent;
uses
Forms, Windows, SysUtils, Classes, Messages, StrUtils;
function WriteToFile(NameFile,str1:string):boolean;
var ft:textfile;
s:string;
y:boolean;
begin
s:=NameFile; AssignFile(ft,s);
try
if (LeftStr(NameFile,2)<>'\\') And (Copy(NameFile,2,1)<>':') then s := ExtractFilePath(Application.ExeName) + s;
if FileExists(s) then Append(ft) else Rewrite(ft);
y := IOResult = 0; if y then Writeln(ft,str1);
except y:=false; end;
if y then CloseFile(ft); Result:=y;
end;
function ExistExecutingApplication(Alias:string; var hFileMapObj: THandle):THandle;
var lpBaseAddress: PChar;
yExist:boolean;
i:integer;
begin
Result:=0;
hFileMapObj := CreateFileMapping(MAXDWORD, nil, PAGE_READWRITE, 0, 4, PChar(Alias));
if (hFileMapObj = 0) then Exit;
yExist:=GetLastError=ERROR_ALREADY_EXISTS;
lpBaseAddress := MapViewOfFile(hFileMapObj, FILE_MAP_WRITE, 0, 0, 0);
if lpBaseAddress <> nil then begin
if Not yExist then begin
StrPCopy(lpBaseAddress, IntToStr(Application.Handle));
end else begin
TryStrToInt(PChar(lpBaseAddress),i); Result:=i;
end;
UnMapViewOfFile(lpBaseAddress);
end;
end;
var c:Cardinal;
i:integer;
hFileMapObj: THandle;
yWork:boolean;
cmd,appfile,appparams:string;
AppList:TStringList;
cd: TCopyDataStruct; pcd: PCopyDataStruct;
Msg: TMsg;
begin
cmd:=Trim(System.ParamStr(1)); appfile:=Trim(System.ParamStr(2)); appparams:=Trim(System.ParamStr(3));
c:=ExistExecutingApplication('ApplicationsAgent',hFileMapObj); yWork:=true;
if (c>0) then begin
if Trim(appfile)<>'' then begin
cd.cbData := Length(appfile)+1;
cd.lpData := PChar(appfile);
if AnsiUpperCase(cmd)='ADD' then i:=0 else i:=1;
PostMessage(c, WM_COPYDATA, i, LParam(@cd));
end;
yWork:=false;
end;
if yWork then begin
AppList:=TStringList.Create;
if Trim(appfile)<>'' then begin
if AnsiUpperCase(cmd)='ADD'
then AppList.Add(appfile)
else AppList.Delete(AppList.IndexOf(appfile));
end;
while AppList.Count>0 do begin
if PeekMessage(Msg,0,0,0,PM_REMOVE) then begin
case Msg.message of
WM_COPYDATA: begin
pcd := PCopyDataStruct(Msg.LParam);
appfile := PChar(pcd.lpData);
case Msg.wParam of
0:
AppList.Add(appfile);
1:
AppList.Delete(AppList.IndexOf(appfile));
end;
end;
end;
end;
for i:=0 to AppList.Count-1 do begin
WriteToFile('qqq.txt',IntToStr(Application.Handle)+' - '+IntToStr(i)+' - '+AppList[i]);
end;
Sleep(500);
end;
AppList.Free;
end;
CloseHandle(hFileMapObj);
end.