Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism IPC zwischen zwei Programmen (https://www.delphipraxis.net/155320-ipc-zwischen-zwei-programmen.html)

Digielm 18. Okt 2010 15:30

Delphi-Version: 2007

IPC zwischen zwei Programmen
 
Hallo Leute,

ich hab da immernoch ein riesen Problem.

Ich möchte gerne folgenden machen.

Es gibt 2 Programme die untereinander Daten tauschen sollen.
Mit Messages klappt das nicht so wirklich, da die Daten immer kompl. gesendet bzw. empfangen werden müssen.

Ich hab die Idee das ein Programm einen Channel aufmacht und das andere Programm je nach bedarf den channel ausliest.

Ich hab da auch Source in C# kriege das aber nicht umgebaut in Delphi Dot Net 2007

Wer kann mir helfen wäre suppi da was für zu kriegen .


Danke im Voraus

Luckie 18. Okt 2010 15:36

AW: IPC zwischen zwei Programmen
 
Zitat:

Zitat von Digielm (Beitrag 1056347)
Mit Messages klappt das nicht so wirklich, da die Daten immer kompl. gesendet bzw. empfangen werden müssen.

Was für Nachrichten?

Dann gibt es da noch MMF, Pipes, TCP/IP, ...

Digielm 18. Okt 2010 16:02

AW: IPC zwischen zwei Programmen
 
Ich weiß nicht wie aber ich hab hier mal ein Source Beispiel von C#

Würde das gerne so oder so ähnlich umsetzen.

Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using Remoteable;

namespace IPCChannelRemoting
{
    /// <summary>
    /// Remote Objekt ermöglicht der GN Server Config GUI den Status Abruf der
    /// GN Servers über den IPC Channel.
    /// </summary>
    public class RemoteObj : MarshalByRefObject,
            ISharedAssemblyInterface
    {
        /// <summary>
        /// Konstruktor
        /// </summary>
        public RemoteObj()
        {

        }

        /// <summary>
        /// Ruft den aktuellen Status der angemeldeten GN User ab.
        /// Jeder User wird in eine string Array gespeichert.
        /// Die Gesamtheit aller User in einer ArrayList.
        /// </summary>
        /// <returns>ArrayList mit GN-UserInfos</returns>
        public ArrayList GetUserList()
        {
            ArrayList result = new ArrayList();
            foreach (ClientInfo client in MainClass.TCPServer.ClientList)
            {
                string[] values = new string[7];
                values[0] = client.Line;
                values[1] = client.strName;
                values[2] = client.socket.RemoteEndPoint.ToString();
                values[3] = client.Status.ToString("G");
                values[4] = client.CallHandle.ToString();
                values[5] = client.Number;
                values[6] = client.Direction.ToString();
                result.Add(values);
            }
            return result;
        }

        /// <summary>
        /// Ruft den aktuellen Stand der TAPI-Lines ab.
        /// Jede TAPI Line wird in einem string Array gespeichert. Die
        /// Gesamtheit alle Lines wird in einer ArrayList gespeichert.
        /// </summary>
        /// <returns>ArrayList mit den TAPI Line Infos</returns>
        public ArrayList GetLines()
        {
            ArrayList result=new ArrayList();
            TAPILines tapiLines = frmMain.TAPILinesList;
            foreach (TAPILine tl in tapiLines.TapiLinesList)
            {
                string[] values = new string[8];
                values[0] = tl.AddressName;
                values[1] = tl.DeviceName;
                values[2] = tl.GWUserName;
                values[3] = tl.CallActive.ToString();
                values[4] = tl.CallHandle.ToString();
                values[5] = tl.CallCalledID;
                values[6] = tl.CallCallerID;
                values[7] = tl.CallBegan;
                result.Add(values);
            }
            return result;
        }

        /// <summary>
        /// Test Methode um IPC Verbindung zu testen.
        /// </summary>
        /// <returns></returns>
        public string GetTest()
        {
            return "Test";
        }
    }
}

namespace Remoteable
{
    /// <summary>
    /// Interface für das Remote Objekt der IPC Verbindung.
    /// </summary>
    public interface ISharedAssemblyInterface
    {
        ArrayList GetUserList();
        ArrayList GetLines();
        string GetTest();
    }
}
der Vorteil dabei wäre, wenn ich vom Client aus die arraylisten abfrage sind diese immer aktuell.

Nur irgendwie beiße ich mir grade die Zähne an der Umsetzung in Delphi aus.

Hat da jemand einen TIP ??

idefix2 18. Okt 2010 16:15

AW: IPC zwischen zwei Programmen
 
Ich denke, dafür wäre es am besten, ein MMF zu verwenden. Dann kannst du von beiden Programmen aus gleichberechtigt zugreifen.

Neumann 18. Okt 2010 18:51

AW: IPC zwischen zwei Programmen
 
Wie ist es mit einer Datenbank wie z.B. Firebird? Zwei Programme greifen auf dies zu und die ganze Sache wird einfach.


Gruß

Ralf

Phoenix 18. Okt 2010 20:00

AW: IPC zwischen zwei Programmen
 
Zitat:

Zitat von Neumann (Beitrag 1056376)
Wie ist es mit einer Datenbank wie z.B. Firebird? Zwei Programme greifen auf dies zu und die ganze Sache wird einfach.

Du willst für einfache IPC nen kompletten Datenbankserver aufsetzen? Das macht die Sache nicht einfach, sondern ungeheuer komplex und führt eine ganz neue Komplexität in Sachen potentiellen Fehlern ein (Läuft die DB? Sind die Programme beide richtig für die DB konfiguriert? etc.).

Was hältst Du von Messagequeues? Sind ne ganz simple Geschichte in .NET, weil man nur die Queue aufmacht und reinschreibt und der andere empfängt die Nachrichten und gut ist.

Siehe den Artikel hier: http://articles.techrepublic.com.com...1-6170794.html
Übersetzen muss man da nix großartig, weil die Methoden und Eigenschaften ja eh gleich heissen. Referenz auf System.Messaging setzen und ab die Post ;-)

idefix2 19. Okt 2010 01:22

AW: IPC zwischen zwei Programmen
 
Aber Delphi 5 kann mit C# und .net nicht viel anfangen, wenn ich mich nicht irre.

Message Queues machen Sinn, wenn Nachrichten (z.B. Statusmeldungen oder dergleichen) zwischen Prozessen ausgetauscht werden sollen.
Wenn zwei Programme einen gemeinsamen Datenbestand verwenden sollen, ist ein Memory mapped File die bei weitem einfachere Methode.

mjustin 19. Okt 2010 06:26

AW: IPC zwischen zwei Programmen
 
Zitat:

Zitat von idefix2 (Beitrag 1056392)
Aber Delphi 5 kann mit C# und .net nicht viel anfangen, wenn ich mich nicht irre.

Für Microsoft Message Queue (das bei jeder Windows Version enthalten ist) kann man in Delphi das ActiveX importieren.

Mit Message Queues kann man auch einfache RPC-style Dienste bauen, d.h. Client A sendet eine Nachricht mit einer Anforderung, und B liest diese und sendet an A die Antwort zurück.

Vorteile von Message Queues (hängen vom Broker ab): zum Beispiel Unterstützung von Transaktionen. MSMQ muss ich mir aber erst noch mal näher ansehen...

Phoenix 19. Okt 2010 07:44

AW: IPC zwischen zwei Programmen
 
Zitat:

Zitat von idefix2 (Beitrag 1056392)
Aber Delphi 5 kann mit C# und .net nicht viel anfangen, wenn ich mich nicht irre.

Hab ich jetzt was massives verpasst, oder wie kommst Du auf Delphi 5??
Digielm meinte doch Delphi für .NET 2007 (*schauder*), und nicht Delphi 5?

Digielm 19. Okt 2010 09:49

AW: IPC zwischen zwei Programmen
 
Zitat:

Zitat von Phoenix (Beitrag 1056380)
Zitat:

Zitat von Neumann (Beitrag 1056376)
Wie ist es mit einer Datenbank wie z.B. Firebird? Zwei Programme greifen auf dies zu und die ganze Sache wird einfach.

Du willst für einfache IPC nen kompletten Datenbankserver aufsetzen? Das macht die Sache nicht einfach, sondern ungeheuer komplex und führt eine ganz neue Komplexität in Sachen potentiellen Fehlern ein (Läuft die DB? Sind die Programme beide richtig für die DB konfiguriert? etc.).

Was hältst Du von Messagequeues? Sind ne ganz simple Geschichte in .NET, weil man nur die Queue aufmacht und reinschreibt und der andere empfängt die Nachrichten und gut ist.

Siehe den Artikel hier: http://articles.techrepublic.com.com...1-6170794.html
Übersetzen muss man da nix großartig, weil die Methoden und Eigenschaften ja eh gleich heissen. Referenz auf System.Messaging setzen und ab die Post ;-)

So hab das mal versucht zu machen bekomme aber diese Fehlermeldung
"Message Queuing wurde auf diesem Computer nicht installiert"

Wie kann ich das denn auch ohne diese Installation hinbekommen, da weder ich noch die meisten Kunden dieses Feature installiert haben.
Es muss ja auch irgendwie anders gehen .


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 Uhr.
Seite 1 von 2  1 2      

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