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...
Verwende das Stichwort: IPC
= Inter Process Communication
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#
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.
Die Erweiterung ist jetzt das ich von meinem C# Programm an ein Delphi Programm sende.
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
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;
}
}
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.
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?
@ 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);
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?
klingt stark nach [FAQ] Warum blockiert mein GUI?
Jetzt hab ich noch nen kleines Problem.
Bitte nur ein Thema pro Thread.