Autor Beitrag
Maggi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 160

WIN XP, WIN 2003
D5 Enter D 2006
BeitragVerfasst: Di 27.08.02 13:17 
Hallo zusammen,

ich bin dabei eine sehr umfangreiche Anwendung zu programmieren und möchte diese gern in unterschiedliche Exefiles aufteilen (und bearbeiten können), dazu muß ich aber Parameter über das Windows an das andere Programm schicken können. Hat da einer vielleicht schon Erfahrung mit gesammelt, oder kennt gute Quellen, anhand dessen man sich sowas aneignen kann??? :?:

Dank im Vorraus... :)

Maggi
SMI
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106

Win95-2003 / Debian / Suse
D1/D3/D6/D7
BeitragVerfasst: Di 27.08.02 14:05 
Am besten verwendest du DLL's

Windows Nachrichten kann man via postmessage senden.


SMI
Maggi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 160

WIN XP, WIN 2003
D5 Enter D 2006
BeitragVerfasst: Di 27.08.02 14:42 
Hi, @SMI

gibt es da irgendwo Info's zu wie ich diese benitzen muß, oder vielleicht ein Tutorial??

Maggi
SMI
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106

Win95-2003 / Debian / Suse
D1/D3/D6/D7
BeitragVerfasst: Di 27.08.02 14:55 
Da kann ich nur die Windows API Hilfe, bzw Delphi Hilfe erwähnen, wenn du c++ lesen kannst bietet sich die msdn von Microsoft an. Desweiteren veruch einfach mal zu googeln.

hier sind zwei Auszüge aus der Hilfe:

Zum Empfangen bietet sich folgendes an:

Zitat:

Eine Botschaftsbehandlungsmethode wird über die Direktive message in der Methodendeklaration definiert.

type
TTextBox = class(TCustomControl)
private
procedure WMChar(var Message: TWMChar); message WM_CHAR;
...
end;

Bei einer Botschaftsbehandlungsmethode muß es sich um eine Prozedur mit einem einzigen Variablenparameter handeln. Außerdem muß auf das Schlüsselwort message eine Integer-Konstante mit einem Wert zwischen 1 und 49151 folgen. Dieser Wert bezeichnet die Botschafts-ID.



Zum Senden:
Zitat:

The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and then returns without waiting for the thread to process the message. Messages in a message queue are retrieved by calls to the GetMessage or PeekMessage function.

BOOL PostMessage(

HWND hwnd, // handle of destination window
UINT uMsg, // message to post
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);


SMI
Günter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 29.08.02 10:02 
Hallo Maggi,

Wenn du Daten zwischen zwei Prozessen (Anwendungen) austauschen willst, hast du mehrere Möglichkeiten, folgende 2 sind aber meiner Meinung nach die elegentesten:

1. Windows Registry:
Schreib die Daten die das andere Programm benötigt in die Registry, die Daten können dann von einem anderen Programm wieder ausgelesen werden.

2. TCP/IP:
Definiere eine Schnittstelle in den einzelnen Programmteilen, die eine Kommunikation über TCP/IP ermöglichen. Dafür benötigt man kein Netzwerk und auch keine Netzwerkkarte, verwende aber einen freien Port (ab 1500 oder so). Programmteile von Windows selbst kommunizieren über diese Art und Weise miteinander.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 29.08.02 10:39 
Günter hat folgendes geschrieben:
1. Windows Registry:
Schreib die Daten die das andere Programm benötigt in die Registry, die Daten können dann von einem anderen Programm wieder ausgelesen werden.

Und wenn Programm B bereits zugreift, obwohl Programm A noch keine Daten abgelegt hat? Immerhin ist die Grundidee ja, ein umfangreiches Programm in mehrere Module zu trennen, die u.U. auch gleichzeitig aktiv sind, bzw. sein können. Die Idee mit der Registry halte ich also für wenig nutzbringend.

Zitat:
2. TCP/IP:
Definiere eine Schnittstelle in den einzelnen Programmteilen, die eine Kommunikation über TCP/IP ermöglichen. Dafür benötigt man kein Netzwerk und auch keine Netzwerkkarte, verwende aber einen freien Port (ab 1500 oder so). Programmteile von Windows selbst kommunizieren über diese Art und Weise miteinander.

Diese "Client/Server"-Idee ist schon besser. :wink:

Wenn das Projekt aber -trotz des Umfangs- noch ein einfaches ist, dann spricht nichts gegen ein WM_COPYDATA zwischen den einzelnen Anwendungen. (Wenn es einzelne Programme sind.)
Und bei DLLs lassen sich die Funktionen ja (hoffentlich) einfach nur aufrufen, tun ihre Arbeit, geben evtl. ein Ergebnis zurück, und fertig.
Günter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 29.08.02 11:17 
Hallo Hias,

das mit der Synchronisation bei Registry-Zugriffen ist denke ich kein so großes Problem , wenn Modul A erst in die Registry schreibt, dann Modul B aufgerufen wird). Wenn die Programmteile Parallel laufen wird es schon komplizierter, da hast du völlig recht.

Wenn man Daten sowohl von A nach B, als auch von B nach A schicken will, klappt das mit der DLL auch nicht mehr so gut ( wenn beide Module unabhängig voneinander laufen sollen).

Für Extrem-Fälle könnte ich noch auf COM verweisen...

Gruß Günter
toms
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1099
Erhaltene Danke: 2



BeitragVerfasst: Do 29.08.02 12:14 
Ich würd's mal mit WM_COPYDATA probieren.
Ist relativ einfach, da Windows das ganze Speicher Management
übernimmt und es lassen sich damit beliebige Strukturen,
Streams übermitteln.

Hab mal ein Beispiel-Projekt zum Übermitteln von Text, Bildern
zwischen 2 Anwendungen geschrieben.
Direkter Download:

www.swissdelphicente...download.php?id=1242