AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Beliebiges Objekt mit Befehlszeile übergeben?
Thema durchsuchen
Ansicht
Themen-Optionen

Beliebiges Objekt mit Befehlszeile übergeben?

Ein Thema von PeterPanino · begonnen am 24. Jan 2008 · letzter Beitrag vom 24. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#1

Beliebiges Objekt mit Befehlszeile übergeben?

  Alt 24. Jan 2008, 00:56
Für die Übergabe strukturierter Informationen an ein zu startendes Programm eignet sich die Befehlszeile nur bedingt, da sie m.W. eine begrenzte Länge hat und nur als lineare Zeichenfolge definiert werden kann. Es wäre nützlich, wenn man über die Befehlszeile ein beliebiges Objekt (Datenstruktur) übergeben könnte. Als erstes fiele mir hierzu eine temporäre Datei ein, was aber in der Praxis doch mehr Probleme aufwerfen als Nutzen bringen würde. Ideal wäre die Übergabe eines Zeigers auf ein gemeinsames Objekt im Speicher, aber wie könnte man das realisieren? Wer hat eine Idee?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.608 Beiträge
 
#2

Re: Beliebiges Objekt mit Befehlszeile übergeben?

  Alt 24. Jan 2008, 06:50
Hrm.

Wenn Du von einem 'gemeinsamen' Speicherbereich redest willst Du also eigentlich Daten von einem anderen Programm in Deinem weiterverarbeiten?

Das ganze riecht mir in dem Fall stark nach IPC (Interprozesskommunikation), und hat mit der Kommandozeile in der Regel nicht sehr viel zu tun.

Aber hier mal eine Liste der Möglichkeiten, die mir spontan dazu einfallen:

1.) Straightforward und schon genannt: Daten in temporäre Datei schreiben, Dateinamen übergeben

2.) Auch Straightforward: Daten in XML serialisieren, Whitespaces entfernen und so die ganzen XML-Daten in einer Zeile an Dein Programm übergeben. Stellt sich die Frage, wie lang ein Parameter auf der Kommandozeile sein darf.

3.) Etwas, das unter Linux-Systemen sehr gängig ist: StdIn umleiten. Will heissen, die Daten werden in einer Textinterpretation (also auch wieder serialisiert) in die Standardeingabe Deines Programmes gepiped. Ist das gleiche wie wenn Du unter linux z.B. die Ausgabe von ps -aux an grep 'Prozessname' pipest.

4.) Gleicher Speicherbereich: Nennt sich Shared Memory. Allerdings ist es da recht tricky, dann auch die richtige Adresse zu bekommen, denn ggf. wird der Bereich an anderen Speicheradressen in die unterschiedlichen Prozesse gepiped. Man muss hier also z.B. am Anfang des SM Informationen über Offsets zum Beginn des Speichers ablegen.

5.) Named Pipes. Wenn der neue Prozess gestartet wurde kann dieser über einen benannten Kanal diese Daten z.B. selber anfordern. GGf. kann der Name der Pipe als 'Adresse' zu den richtigen Daten übergeben werden.

Das war so das was mir spontan vor meinem ersten Kaffee einfällt, was die Grundprinzipien angeht. Solange Du uns aber nicht noch etwas mehr Informationen lieferst ob die andere Software von Dir ist (IPC via Named Pipes und Shared Mem geht nur dann, wenn beide Kommunikationspartner diese Kommunikationsart implementieren) und was für Daten Du da von A nach B schaufeln musst wird Dir wohl keiner einen Hinweis auf eine möglichst gute Lösung geben können.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Beliebiges Objekt mit Befehlszeile übergeben?

  Alt 24. Jan 2008, 07:59
Ich habs mal folgendermaßen gelöst (gut das programm schickt sich quasi selbst ne message - also einer bereits laufenden instanz):

Starten des 2. Programms,
das erste Programm wartet bis das 2. gestartet ist -> danach schickt es ne windows message mit daten dran an das 2. proggi. dabei kann man dann nen record mit übergeben was in den meisten fällen auch ausreicht.

Delphi-Quellcode:
  // Meldung ausgeben, wenn Programm schon mal gestartet!
  hMutex := CreateMutex( nil, // pointer to security attributes
                         True, // flag for initial ownership
                         csAppName ); // pointer to mutex-object name
  if ( GetLastError = ERROR_ALREADY_EXISTS ) then
  begin
    if s <> 'then
    begin
      wnd := FindWindow('xxx', 'xxx');
      if wnd <> 0 then
      begin
        // Daten vorbereiten
        with ACopyDataStruct do
        begin
          dwData := 0;
          cbData := StrLen(PChar(s)) + 1;
          lpData := PChar(s);
        end;
        // Und wech damit..
        SendMessage(wnd, WM_COPYDATA, 0, Longint(@ACopyDataStruct));
      end;
      if ( hMutex <> 0 ) then
        CloseHandle( hMutex );
    end;
    Exit;
  end;
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Beliebiges Objekt mit Befehlszeile übergeben?

  Alt 24. Jan 2008, 09:42
Mmhh, vielen Dank für die Ideen, werde das mal ausprobieren.

Um die Anforderungen näher zu definieren: Ich möchte von meinem Hauptprogram A aus ein Programm B starten und diesem eine beliebige Datenstruktur übergeben. Die Schnittstelle für die Übergabe der Datenstruktur sollte nicht proprietär sein, sodass sie auch von anderen Programmen ohne Code-Implementation - also nur durch Definition der Befehlszeile - verwendet werden kann. Gibt es eigentlich in Windows keine genormte Schnittstelle, mit der man Objekte übergeben kann?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Beliebiges Objekt mit Befehlszeile übergeben?

  Alt 24. Jan 2008, 09:52
Zitat:
Gibt es eigentlich in Windows keine genormte Schnittstelle, mit der man Objekte übergeben kann?
Interfaces; Component Object Model (COM); ActiveX
Edit (IMHO): Und IMalloc ist so ein Interface, wo du dein Objekt platzieren kannst, falls der Objektersteller nicht mehr existiert, wenn der Nutzer darauf zugreift.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Beliebiges Objekt mit Befehlszeile übergeben?

  Alt 24. Jan 2008, 09:56
Hallo,

Windows weiß nichts über die Delphi-Objekte. Ich frage mich, warum du ein eigenständiges Programm B entwickeln möchtest, welches auf die Übergabe eines Delphi-Objektes zur Aufnahme seiner Arbeit angewiesen ist. Wäre da nicht ein Package eine besser geeignete Architekturlösung? Wenn die Programme allerdings entkoppelt sein sollen, dann würde ich COM als standardisierten Windows-Mechanismus in Erwägung ziehen.

Freundliche Grüße
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Beliebiges Objekt mit Befehlszeile übergeben?

  Alt 24. Jan 2008, 10:46
Zitat von PeterPanino:
Um die Anforderungen näher zu definieren: Ich möchte von meinem Hauptprogram A aus ein Programm B starten und diesem eine beliebige Datenstruktur übergeben. Die Schnittstelle für die Übergabe der Datenstruktur sollte nicht proprietär sein, sodass sie auch von anderen Programmen ohne Code-Implementation - also nur durch Definition der Befehlszeile - verwendet werden kann. Gibt es eigentlich in Windows keine genormte Schnittstelle, mit der man Objekte übergeben kann?
Da die anderen Programme dein Objekt nicht kennen, würden sie es niemals ansprechen geschweige denn ansprechen können. Damit lässt sich der kursive, fette Textteil direkt ausschließen.

Und zu der Liste der Windows Schnittstellen dazu noch zwei weitere: Clipboard, DDE
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Beliebiges Objekt mit Befehlszeile übergeben?

  Alt 24. Jan 2008, 11:16
Wenn dein Hauptprogramm kein Service ist eignet sich die schon genannte Methode über Windowsnachrichten dafür hervorragend.

Du benutzt WM_COPYDATA dafür, das nutzt für beide Prozesse denselben Speicher und ist genau für so etwa vorgesehen.

Eine Kommunikation in beide Richtungen ist damit möglich.

Delphi-Quellcode:
var LCopyDataStruct : TCopyDataStruct;
...
...
SendMessage(HandleDesZiels, WM_COPYDATA, EineZahl_BeliebigeDaten, LongInt(@LCopyDataStruct));
PostMessage oder SendMessage dafür nutzen, je nach dem was man erreichen möchte.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Beliebiges Objekt mit Befehlszeile übergeben?

  Alt 24. Jan 2008, 11:32
Zitat von Tyrael Y.:
Wenn dein Hauptprogramm kein Service ist eignet sich die schon genannte Methode über Windowsnachrichten dafür hervorragend.

Du benutzt WM_COPYDATA dafür, das nutzt für beide Prozesse denselben Speicher und ist genau für so etwa vorgesehen.

Eine Kommunikation in beide Richtungen ist damit möglich.

Delphi-Quellcode:
var LCopyDataStruct : TCopyDataStruct;
...
...
SendMessage(HandleDesZiels, WM_COPYDATA, EineZahl_BeliebigeDaten, LongInt(@LCopyDataStruct));
PostMessage oder SendMessage dafür nutzen, je nach dem was man erreichen möchte.
Können Windows-Nachrichten unter ungünstigen Bedingungen (z.B. Betriebssystem ausgelastet) nicht auch schon mal verloren gehen?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Beliebiges Objekt mit Befehlszeile übergeben?

  Alt 24. Jan 2008, 11:43
(WM_CopyData geht nur über Sendmessage)

Das so etwas verloren geht, wäre mir neu (zumindest wenn der Adressat existiert)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz