Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi nur eine anwendung mit parametern (https://www.delphipraxis.net/15990-nur-eine-anwendung-mit-parametern.html)

nitroex 8. Feb 2004 15:08


nur eine anwendung mit parametern
 
Doswidania!!

Ich bin gerade dabei, ein Prog zu schreiben, welches bestimmte Dateien öffnen und bearbeiten kann.
Nun möchte ich bewirken, dass, wenn ein User auf eine mit meinem Prog verlinkte Datei (z.B: .html oder .php)clickt, mein Prog, wenn noch keine Instanz jenem dessen existiert das Prog geöffnet wird, die Datei (über Prarmeter) bearbeitet werden kann (shon gelöst!!).

Das eigentliche Problem heißt: Wenn shon eine Instanz geöffnet ist, soll die neue bendet werden, aber der Parameter soll irgentwie an die schon existierent existanz übergeben werden!!

:wiejetzt: Wie geht denn dass?!?!?????!?!?

Danke fuer eventuelle Antworten oder Hinweise.

nitroex

Chewie 8. Feb 2004 15:14

Re: nur eine anwendung mit parametern
 
Such mal nach Hier im Forum suchenMutex.

Lefko 8. Feb 2004 15:42

Re: nur eine anwendung mit parametern
 
Hm, genau das hatten wir schonmal.. wenn ich mich nur erinnern könnte... :gruebel:

Naja, such noch ein bisschen, du findest es sicher hier in der DP!

MfG Lefko.

SirThornberry 8. Feb 2004 15:43

Re: nur eine anwendung mit parametern
 
Bezüglich des Mehrfachstarts sollte das gehen
Delphi-Quellcode:
var LHandle: Cardinal;
    Lclass: Array[0..255] of Char;
begin
  CreateMutex(nil,True,'Beliebiger Ausdruck für den Mutex'); //kein mehrfachstart
  if GetLastError = ERROR_ALREADY_EXISTS then //kein mehrfachstart
  begin
    Lhandle := FindWindow(nil, nil);
    while Lhandle <> 0 do
    begin
      GetClassName(Lhandle, Lclass, 255);
      if (Lhandle <> handle) and (string(Lclass) = self.ClassName) then
      begin
        SendMessage(Lhandle, WM_USER + 2, 0, 0); //an dieser Stelle ist dein Einfallsreichtum gefragt, bei meiner Programmvariante sende ich einfach eine message an die bereits laufende instanz welche sich dann in den fordergrund bringt
        Lhandle := 0;
      end else Lhandle := GetWindow(Lhandle, GW_HWNDNEXT);
    end;
    Application.Terminate;
  end;

Jens Schumann 8. Feb 2004 15:56

Re: nur eine anwendung mit parametern
 
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.

nitroex 8. Feb 2004 19:28

Danke!!!
 
Danke!! Das hat mir extremistisach weitergeholfen.

nitorex


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz