Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei per Doppelklick dem bereits geöffneten Programm übergeben (https://www.delphipraxis.net/191314-datei-per-doppelklick-dem-bereits-geoeffneten-programm-uebergeben.html)

Friday 2. Jan 2017 12:30

Datei per Doppelklick dem bereits geöffneten Programm übergeben
 
Hallo,
ich lasse nur eine Instanz meiner Anwendung zu, mit folgendem Code:
Code:
Initialization
  mHandle:=CreateMutex(nil,True,'Programmname');
  if GetLastError=ERROR_ALREADY_EXISTS then
    Halt;

finalization
  if mHandle<>0 then
    CloseHandle(mHandle)
Wenn ich eine Datei mit der Endung die meinem Programm zugewiesen ist, doppelklicke öffne ich sie in dem ich ParamStr(x) in der FormShow Routine meiner Anwendung überprüfe und dann die Datei-Öffnen-Routine aufrufe.

Bloss wie mache ich es wenn ich auf eine Datei meiner Endung doppelklicke und mein Programm bereits geöffnet ist? Ich müsste for dem "Halt" die ParamStr(x) auslesen und der ersten Instanz meines Programmes übergeben. Ist das ein Fall für SharedMemory oder die COM Schnittstelle oder gibt es auch einen einfacheren / direkteren Weg an den ich jetzt nicht denke?

danke schonmal

DeddyH 2. Jan 2017 12:37

AW: Datei per Doppelklick dem bereits geöffneten Programm übergeben
 
WM_COPYDATA fällt mir da spontan ein. Beispiele sollten sich im Forum finden lassen.

himitsu 2. Jan 2017 13:21

AW: Datei per Doppelklick dem bereits geöffneten Programm übergeben
 
IPC

mail-slots
pipes
messages
named MMF oder unnamed MMF via message (RegisterWindowMessage+SendMessage)
uvm.

Und mit Delphi-Referenz durchsuchenHalt beendet man kein VCL-Programm, jedenfalls nicht, wenn man es "ordentlich" machen will.
Entweder wie in der OH genannt oder garnicht erst ins
Delphi-Quellcode:
Application.Run
reinlaufen.

Der schöne Günther 2. Jan 2017 13:23

AW: Datei per Doppelklick dem bereits geöffneten Programm übergeben
 
Zitat:

Zitat von himitsu (Beitrag 1357751)
Und mit Halt beendet man kein VCL-Programm, jedenfalls nicht, wenn man es "ordentlich" machen will.

Was ist denn daran nicht ok? Vor allem wenn er es im init-Block seiner DPR anscheinend macht.

Mikkey 2. Jan 2017 13:36

AW: Datei per Doppelklick dem bereits geöffneten Programm übergeben
 
Ich würde das mit GlobalAlloc und einer WM_USER-Nachricht machen. WM_COPYDATA erfordert ein eigenes Fenster, das Dir beim Programmbeginn noch nicht zur Verfügung steht.

Ablauf:
Code:
GlobalAlloc(ausreichende Größe, um den übergebenen Dateipfad darin unterzubringen)
GlobalLock()
Pfad in den Speicherbereich übertragen
GlobalUnlock()
SendMessage(WM_USER+x, Handle aus GlobalAlloc)

Verarbeiten im empfangenden Programm:
GlobalLock
herauskopieren des Inhalts
GlobalUnlock
PostMessage (z.B: WM_USER+x+1)
Return

GlobalFree()
Beenden

Luckie 2. Jan 2017 13:52

AW: Datei per Doppelklick dem bereits geöffneten Programm übergeben
 
Zitat:

Zitat von Mikkey (Beitrag 1357756)
WM_COPYDATA erfordert ein eigenes Fenster, das Dir beim Programmbeginn noch nicht zur Verfügung steht.

Wieso? Sein Programm läuft doch schon, also ist auch ein Fenster da, an das man die Nachricht schicken kann.

Mikkey 2. Jan 2017 14:04

AW: Datei per Doppelklick dem bereits geöffneten Programm übergeben
 
Zitat:

Zitat von Luckie (Beitrag 1357759)
Zitat:

Zitat von Mikkey (Beitrag 1357756)
WM_COPYDATA erfordert ein eigenes Fenster, das Dir beim Programmbeginn noch nicht zur Verfügung steht.

Wieso? Sein Programm läuft doch schon, also ist auch ein Fenster da, an das man die Nachricht schicken kann.

Zitat aus der MS-Doku:
Zitat:

Parameters
wParam
A handle to the window passing the data.

himitsu 2. Jan 2017 17:09

AW: Datei per Doppelklick dem bereits geöffneten Programm übergeben
 
Auch dein SendMessage braucht ein Window-Handle, genauso wie WM_COPYDATA.

Mikkey 2. Jan 2017 17:40

AW: Datei per Doppelklick dem bereits geöffneten Programm übergeben
 
Zitat:

Zitat von himitsu (Beitrag 1357800)
Auch dein SendMessage braucht ein Window-Handle, genauso wie WM_COPYDATA.

Aber nur für das Zielfenster, das sich mit FindWindow leicht herausfinden lässt. Bei WM_COPYDATA ist ein Fenster des Senders erforderlich (warum auch immer).

DeddyH 2. Jan 2017 17:55

AW: Datei per Doppelklick dem bereits geöffneten Programm übergeben
 
Von "erforderlich" kann ich im MSDN aber nirgends etwas lesen. Vielmehr verstehe ich das so, dass man hier optional das Fensterhandle des Senders hinterlegen kann. Ich würde es einfach mal mit einer 0 probieren, sollte das nicht klappen, mit HWND_MESSAGE oder so.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr.
Seite 1 von 3  1 23   

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