Einzelnen Beitrag anzeigen

Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#5

Re: nur eine anwendung mit parametern

  Alt 8. Feb 2004, 16:56
Hallo,
hier kommt die Lösung:
Achtung: das hier ist der Projektquelltext
Delphi-Quellcode:
program Project2;

uses
  Windows,
  Messages,
  SysUtils,
  Forms,
  Unit1 in 'Unit1.pas{FormSemaphore};

{$R *.res}

var
  hTargetWnd : hWnd;
  hSemaphore : THandle;
  aCopyData : TCopyDataStruct;
  aParam : String;

begin
  hSemaphore:=CreateSemaphore(Nil,0,1,'Semaphore_1');
  If hSemaphore<>0 then
    begin
    If GetLastError=ERROR_ALREADY_EXISTS then
      begin
      // Suche jetzt das Hauptfenser der ersten Instanz
      hTargetWnd:=FindWindow('TFormSemaphore',Nil);
      If hTargetWnd<>0 then
        begin
        If ParamCount>0 then // wurden Parameter übergeben
          begin
          aParam:=ParamStr(1); // Wenn im Explorer auf eine Datei geklickt
                               // und die Dateiendnung mit dem Programm verknüpft
                               // ist, steht in ParamStr(1) der Pfad und Dateiname
                               // dieser Datei.
          //verpacke den Dateinamen in eine TCopyDataStruct
          With aCopyData do
            begin
            dwData:=0;
            cbData:=StrLen(PChar(aParam))+1; // Nullterminierung berücksichtigen mit +1 !!!
            lpData:=PChar(aParam);
            end; // with aCopyData do
          // schicke jetze die WM_COPYDATA Botschaft das Hauptfenser der ersten Instanz
          SendMessage(hTargetWnd,WM_COPYDATA,LongInt(Application.Handle),LongInt(@aCopyData));
          end; // If ParamCount>0 then
        end; // If hTargetWnd<>0 then
      end // If GetLastError=ERROR_ALREADY_EXISTS then
        else
          begin
          Application.Initialize;
          Application.CreateForm(TFormSemaphore, FormSemaphore);
          Application.Run;
          CloseHandle(hSemaphore);
          end;
    end;
end.
Jetzt kommt die unit des Hauptformulars
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFormSemaphore = class(TForm)
    Label1: TLabel;
    ListBox1: TListBox;
    Label2: TLabel;
  private
    { Private-Deklarationen }
   procedure WMCopyData(var Message : TWMCopydata); message WM_COPYDATA;
  public
    { Public-Deklarationen }
  end;

var
  FormSemaphore: TFormSemaphore;

implementation

{$R *.dfm}

{ TTFormSemaphore }

procedure TFormSemaphore.WMCopyData(var Message: TWMCopydata);
{Hier empfängt das Programm die WM_COPYDATA Botschaft.
in Message.CopyDataStruct.lpdata steht jetzt der Pfad und der Dateiname.
Jetzt muss das nur passend verarbeitet werden.}

var
    sText : Array[0..255] of Char;
begin
  Label2.Caption:='WM_CopyData';
  StrLCopy(sText,Message.CopyDataStruct.lpdata,Message.CopyDataStruct.cbdata);
  ListBox1.Items.Add(sText);
end;

end.
  Mit Zitat antworten Zitat