Einzelnen Beitrag anzeigen

Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#10

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben

  Alt 20. Mär 2004, 16:19
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
  Mit Zitat antworten Zitat