Thema: Delphi Programm nur 1x starten

Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.106 Beiträge
 
Delphi 11 Alexandria
 
#12
  Alt 15. Dez 2002, 03:57
Moin Zusammen,

und so wäre man dann auf der sicheren Seite:
Diesmal über die Message WM_COPYDATA
(gekürzt, der Rest steht oben)

Delphi-Quellcode:
program Multifileload;

uses
  //...
  messages, // wg. WM_COPYDATA
  //...

var
  //...
  cdWork : TcsCopyDataStruct;

begin
    //...
    else
    begin
      // Den Fenstertitel des Programmes abfragen
      hWindow := FindWindow(nil,'Multifiledemo');
      if hWindow <> 0 then
      begin // gefunden, dann den Dateinamen an die laufende Instanz senden
        if (paramcount > 0) and FileExists(paramstr(1)) then
        begin
          // CopyData Struktur füllen
          cdWork.dwData := dwMessage; // Message, das eine zu ladende Datei da ist
          cdWork.cbData := Length(paramstr(1))+1;
          cdWork.lpData := AllocMem(cdWork.cbData); // Speicher reservieren
          try
            // Und Dateinamen eintragen
            CopyMemory(cdWork.lpData,@paramstr(1)[1],cdWork.cbData-1);
            // Fertig, Daten kopieren
            SendMessage(hWindow,WM_COPYDATA,0,lParam(@cdWork));
          finally
            // Speicher wieder freigeben
            FreeMem(cdWork.lpData,cdWork.cbData);
          end;
        end;
      end;
    end;
  //...
end.
Delphi-Quellcode:
//...
// Deklaration für die CopyData Strutur
type
  PcsCopyDataStruct = ^TcsCopyDataStruct;
  TcsCopyDataStruct =
  packed record
    dwData : DWORD;
    cbData : DWORD;
    lpData : Pointer;
  end;

var
  frmMAIN: TfrmMAIN;
  dwMessage : DWORD;

implementation
uses MDIPart;

{$R *.DFM}

procedure TfrmMAIN.WndProc(var msg : TMessage);

var
  frmWork : TfrmSub;
  pFileName : PChar;
  dwLen : DWORD;
  cdWork : PcsCopyDataStruct;

begin
  if msg.Msg = WM_COPYDATA then
  begin
    // Adresse der übergebenen Daten laden
    cdWork := PcsCopyDataStruct(msg.lParam);
    // Message prüfen
    if cdWork.dwData = dwMessage then
    begin
      // Neues Unterfenster generieren
      frmWork := TfrmSub.Create(self);
      // Datei aus übergebenem Namen laden
      frmWork.Memo1.Lines.LoadFromFile(PChar(cdWork.lpData));
    end;
  end
  else
  begin
    // Jede andere Message an die ursprüngliche Prozedure weiterreichen
    inherited WndProc(msg);
  end;
end;

//...
end.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat