Hallo!
Ich habe das einmal so gelöst. Ist zwar nicht schön, funktioniert aber:
In der Projektdatei:
Delphi-Quellcode:
var
Semaphore: THandle;
theFiles : String;
i : Integer;
MyCopyDataStruct: TCopyDataStruct;
begin
ActivationMessage := RegisterWindowMessage(PChar(MyGUID));
Semaphore := CreateSemaphore(nil, 1, 1, PChar(MyGUID));
if (GetLastError = ERROR_ALREADY_EXISTS) then
begin
PostMessage(HWND_BROADCAST, Mainform.ActivationMessage, 0, 0);
if ParamCount > 0 then
begin
theFiles := '';
for i:=1 to ParamCount do
begin
theFiles := theFiles + ParamStr(i);
if i < ParamCount then theFiles := theFiles + '|';
end;
with MyCopyDataStruct do
begin
dwData := 0;
cbData := StrLen(PChar(theFiles));
lpData := PChar(theFiles);
end;
SendMessage(HWND_BROADCAST, WM_COPYDATA, LongInt(Application.Handle), Longint(@MyCopyDataStruct));
end;
end
else
{Mache das, was Du auch sonst hier treibst.}
Und in der Hauptform:
Delphi-Quellcode:
private
{...}
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
{...}
procedure Tfrm_main.WMCopyData(var Msg: TWMCopyData);
var sText: Array of Char;
fad, theFiles : TStringList;
i,k : Integer;
temp : String;
begin
SetLength(sText, Msg.CopyDataStruct.cbData);
StrLCopy(@sText[0], Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
theFiles := TStringList.Create;
fad := TStringList.Create;
try
temp := '';
k := 0;
fad.Add('');
for i:=0 to High(sText) do
begin
if (sText[i] = '|') and (i < High(sText)) then
begin
fad.Add('');
inc(k);
end else
fad[k] := fad[k] + sText[i];
end;
for i:=0 to fad.Count - 1 do
begin
if FileGetAttr(fad[i]) and faDirectory <> 0 then
addFilesFromFolder(fad[i])
else
theFiles.Add(fad[i]);
end;
addFiles(theFiles);
finally
theFiles.Free;
fad.Free;
end;
end;
Damit wird folgendes gemacht:
Die Parameter werden in der Projektdatei erst einmal alle mit '|' getrennt, weil das in Dateinamen nicht vorkommen kann. Dann werden alle komplett an das laufende Programm gesendet.
Dieses nimmt die wieder auseinandern und speichert die einzelnen Paraemter wieder in der StringList fad ("files and directories"). Die Liste wird durchgegangen und je nachdem, ob es sich um ein Verzeichnis oder nur um eine Datei handelt, wird was anderes gemacht. Letzteres braucht Ihr wahrscheinlich nicht, aber es ist halt aus meinen Programm rauskopiert.
MfG
Peter
Christian S.
Admin in der Entwickler-Ecke