Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
Delphi 2009 Professional
|
Re: nur eine anwendung mit parametern
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.
|
|
Zitat
|