Laden...

Kommunikation zwischen zwei Programmen

Erstellt von Snupru vor 13 Jahren Letzter Beitrag vor 13 Jahren 10.066 Views
Thema geschlossen
S
Snupru Themenstarter:in
29 Beiträge seit 2010
vor 13 Jahren
Kommunikation zwischen zwei Programmen

Ich habe ein C# Programm geschrieben, dieses soll nun an ein anderes Programm ein Dateipfad übergeben.
Wenn das funktioniert soll das andere Programm was zurück schicken.

Wie mach ich das?

Beides ist in C# geschrieben.

Sufu hab ich benutzt aber leider nicht sehr Erfolgreich...

Gelöschter Account
vor 13 Jahren

Verwende das Stichwort: IPC
= Inter Process Communication

S
Snupru Themenstarter:in
29 Beiträge seit 2010
vor 13 Jahren

Danke.
Hab gleich was gefunden.
Wenn man mal das Stichwort weiß 😁

Falls jemand das gleiche Problem hat und den Beitrag findet:
Das hilft weiter: Inter-Process Communication with C#

3.728 Beiträge seit 2005
vor 13 Jahren
Ipc

Hallo Snupru,

was Du gefunden hast, funktioniert zwar, ist aber recht umständlich und bietet keinen Komfort. Eine Alternative wäre IPC-Kommunikation mit .NET Remoting. Stichworte: C#, Remoting, IpcChannel. Oder Du machst es mit der Windows Communication Foundation.

Eine weitere Alternative wäre Zyan.

S
Snupru Themenstarter:in
29 Beiträge seit 2010
vor 13 Jahren

Die Erweiterung ist jetzt das ich von meinem C# Programm an ein Delphi Programm sende.

3.728 Beiträge seit 2005
vor 13 Jahren
COM-Schnittstelle

Hallo Snupru,

dann ist Remoting oder Zyan nicht geeignet. Die könntest Deine Anwendung aber mit COM-Schnittstellen ausstatten. Das Unterstützt auch Delphi. So können die Delphi-Anwendung und die C#-Anwendung bequem auf Objekte der jeweils anderen Anwendung zugreifen.

MSDN: COM Interop Part 1: COM Client
MSDN: COM Interop Part 2: COM Server

An Introduction ro COM Programming with Delphi

S
Snupru Themenstarter:in
29 Beiträge seit 2010
vor 13 Jahren

Ich konnte jetzt mit dem anderen Programm kommunizieren.

Ich wollte dann einen String (Namen einer Datei) als Byte Array senden.
Der String wurde in ein Byte Array verwandelt und dann per SendMessage "verschickt".
Als Message hab ich WM_COPYDATA verwendet.

Leider kommt bei dem anderen Programm nur Schrott raus.
Das angekommene Byte Array hat die richtige größer aber der Inhalt stimmt überhaupt nicht mehr überein.

Hier mal die Ausschnitte:


 private struct CopyDataStruct
        {
            public IntPtr dwData;
            public int cbData;
            public IntPtr lpData;
        }

        private struct lpDataStruct
        {
            public uint function;
            public int size;
            public Byte[] data;
        }

....


public static IntPtr sendName(IntPtr pSourcehandle, int pTargetHandle, uint pAdress, Byte[] nameInByte)
        {            
            try
            {
                if (pTargetHandle > 0)
                {
                    cds.dwData = pSourcehandle;
                    cds.cbData = 6 + nameInByte.Length;
                    lds.data = nameInByte;
                    lds.function = pAdress;
                    lds.size = nameInByte.Length;
                    IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(lds));                   

                    Marshal.StructureToPtr(lds, pnt, false);

                    cds.lpData = pnt;
                    return SendMessage((IntPtr)pTargetHandle, WM_COPYDATA, 0, ref cds);
                }
                return (IntPtr)0;
            }            
        }

175 Beiträge seit 2010
vor 13 Jahren

Ich wollte dann einen String (Namen einer Datei) als Byte Array senden.
Der String wurde in ein Byte Array verwandelt und dann per SendMessage "verschickt".
Als Message hab ich WM_COPYDATA verwendet.

Leider kommt bei dem anderen Programm nur Schrott raus.

Ich kann Dir bei Deinem Problem konkret nicht helfen, aber Du könntest Dir ja als Alternative mal den InstanceManager im Paket http://additionaldotnet.codeplex.com/ angucken - oder guckst Du hier Additional.NET

Lade Dir mal den Source runter und wirf mal einen Blick in den Source src/TestApp/Xml/Program.cs - da findest Du ein Beispiel, wie man mit dem InstanceManager prüft ob bereits eine Instanz läuft und dann dieser Daten schicken kann...

Bye,
Knick

Debuggers don't remove Bugs, they only show them in Slow-Motion.

S
Snupru Themenstarter:in
29 Beiträge seit 2010
vor 13 Jahren

Ich sende das:

[49, 72, 84, 84, 80, 68, 92, 119, 101, 98, 92, 115, 105, 116, 101, 92, 105, 110, 100, 101, 120, 46, 104, 116, 109]

Empfangen wird das:
[0, 0, 248, 139, 36, 0, 110, 103, 0, 58, 15, 0, 3 , 0, 154, 1, 8, 0, 40, 168, 31, 0, 7, 0, 0]

Das gesendete ist immer gleich aber das empfangen sieht immer anders aus?
Kann es sein, dass das CopyDataStruct verändert wird?

S
Snupru Themenstarter:in
29 Beiträge seit 2010
vor 13 Jahren

@ m.knigge
thx für die mail.

Hab jetzt nochmal genau geloggt und den Fehler eingrenzen können.
Die Daten werden richtig an das Programm geschrieben.

Hier kommt das richtige rein aber leider das falsche raus??


IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(lds)); 
Marshal.StructureToPtr(lds, pnt, false);

S
Snupru Themenstarter:in
29 Beiträge seit 2010
vor 13 Jahren

Es lag an dem


Marshal.StructureToPtr(lds, pnt, false);

Wenn ich das gemacht habe, konnte das andere Programm die Daten nicht mehr auswerten.

Jetzt hab ich noch nen kleines Problem.
Auf der Form ist eine Progressbar, ein Label und ein Button.

Wenn die Übertragung läuft wird der Status in der Progressbar und im Label angezeigt.
Leider kann ich während der Übertragung den Abbrechen Button nicht drücken.

Was muss ich machen, das ich den Button drücken kann?

Gelöschter Account
vor 13 Jahren
Hinweis von herbivore vor 13 Jahren

Jetzt hab ich noch nen kleines Problem.

Bitte nur ein Thema pro Thread.

Thema geschlossen