# Daten von einem C Programm zu einem C++ Programm senden



## teja (30. März 2004)

*[c/c++]Daten von einem C Programm zu einem C++ Programm senden*

Mein Problem:
Also, das Programm von dem ich senden möchte ist ein C Programm und benutzt die WinAPI. Das empfangende Programm ist ein C++ Programm und benutzt keine Fenster und soll dieses auch später nicht tun.
Die beiden Programme laufen auf einen Rechner.

Meine Frage, wie kann ich das machen?


----------



## Kachelator (30. März 2004)

Ich würde dazu neigen, ein unsichtbares Fenster und Windowsmessages zu verwenden. Wäre das möglich? Dann wäre es einfach.

Ansonsten fallen mir noch ein:
- Client/Server-Lösungen mit WinSocket über den Localhost
- eine Datei, über die die Anwendungen kommunizieren

Hat noch jemand eine Idee?


----------



## hulmel (30. März 2004)

-Shared Memory / Semaphoren
-Message Ques

Gibt es sowas auch bei Windows?


----------



## teja (30. März 2004)

Unsichtbares Fenster, was ist das?
Kenne mich halt noch nicht so gut aus 

Die Daten die gesendet werden sollen, werden wohl mindestens jede Sekunde abgefragt, eventuell in noch kürzeren Abständen.


----------



## Kachelator (30. März 2004)

> _Original geschrieben von teja _
> *Unsichtbares Fenster, was ist das?
> Kenne mich halt noch nicht so gut aus
> 
> Die Daten die gesendet werden sollen, werden wohl mindestens jede Sekunde abgefragt, eventuell in noch kürzeren Abständen. *


 Ich meine damit ein normales Windows-Fenster (also ein Fensterfenster  ), das allerdings nicht zur Darstellung, sondern nur zur Kommunikation (Windows-Messages) verwendet wird. Dass die Daten mehrere Male pro Sekunde ausgetauscht werden sollen, sollte kein Problem sein.


----------



## teja (30. März 2004)

> _Original geschrieben von Kachelator _
> *Ich würde dazu neigen, ein unsichtbares Fenster und Windowsmessages zu verwenden. Wäre das möglich? Dann wäre es einfach.
> *



Okay das könnte ich glaube ich machen,  dann nur die Frage wie?
Scheint ja wohl nichr so schwer zu sein, so das ich das auch verstehe.

Schon mal  Danke für die bisherigen Antworten.


----------



## CSANecromancer (31. März 2004)

Mir fallen spontan zwei Möglichkeiten ein:
Für größere Datenmengen würde ich auch eine Transferdatei verwenden, solange das Erstellen und Einlesen der Datei beides deutlich der Sekundenmarke liegt. Bei einem Zyklus von 1 Sekunde sollten dann aber eventuell noch entsprechende Flags gesetzt werden, damit immer nur eines der beiden Programme gleichzeitig auf die Transferdatei zugreift.
Bei geringeren Datenmenge (wenigen Variablen) wäre es doch möglich, die entsprechenden Daten dem C++-Programm als Aufrufparameter zu übergeben, oder? Leider habe ich lange nicht mehr in C programmiert, von daher weiss ich nicht, wie der Aufruf im C-Programm heissen müsste (ich glaube system("Pfad/Name des C++-Programms"); ), aber das aufgerufene C++-Programm könnte dann z.B. mittels

```
int main (int argc, char **argv)
{
  char* parameter1 = argv[1];
  char* parameter2 = argv[2];
...
}
```
auf die übergebenen Werte reagieren. Voraussetzung allerdings wäre, daß das C++-Programm tatsächlich auch vom C-Programm aus gestartet wird und nicht z.B. über einen cron-Job.


----------



## teja (31. März 2004)

Hallo,

nach langem auspropieren und rumsuchen habe ich mich dazu entschlossen es über Shared Memory zu versuchen.

Habe dazu ein Bsp. in einen Buch gefunden , was leider Fehler beim kompilieren anzeigt.  :-(

Frage: 
Darf man den Quellcode aus einem Buch hier anzeigen?


----------



## Kachelator (31. März 2004)

Hm, ich denke: Gib doch einfach den Titel und Autor mit an. Der wird sich freuen über die Publicity! Jedenfalls, wenn es ein gutes Buch ist.  

Aber wenn du Hilfe brauchst, kann man dich ja nicht im Regen stehen lassen, also zeig doch mal! Die Moderatoren können den Beitrag ja immer noch löschen, falls irgendwas nicht in Ordnung ist.


----------



## teja (1. April 2004)

Hallo,

Schande über mich, 
habe ein Projekt als Konsolen Anwendung geöffnet und nicht als Win32 Anwendung. Bin halt ein Grünschnabel. 
Also es läuft, muß jetzt etwas damit rumbasteln bis ich das habe was ich möchte.

Sollten sich da wieder Fragen ergeben melde ich mich.


----------



## teja (19. April 2004)

Nach langer Zeit habe ich das Problem immer noch mnicht im Griff.
Bekomme eine Fehlermeldung und weiß nicht was ich da machen kann?
Zur Zeile mit dem Fragezeichen gibt es folgende Meldung:
(117) : error C2106: '=' : Linker Operand muss ein L-Wert sein


LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	DWORD ThreadID;
	char *MapView;
	HDC hdc;
	PAINTSTRUCT ps;   
	char tmessage[128];
	char HLA_TEST[22];

	switch (message)
	{
	case WM_CREATE:
		hMapObject = CreateFileMapping ((HANDLE) 0xFFFFFFFF,
										 NULL,
										 PAGE_READWRITE,
										 0,
										 sizeof(HLA_TEST),
										 "shared_memory");
	   /*hMapObject = OpenFileMapping (FILE_MAP_READ,
                                        FALSE,
                                        "shared_memory");*/
	   if(hMapObject != NULL)
	   {
		   (LPVOID)MapView = MapViewOfFile (hMapObject,
											FILE_MAP_READ,
											0,
											0,
											0); ?
		   CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendeTest, MapView, 0, &ThreadID);


----------



## Kachelator (19. April 2004)

1. _hMapObject _ scheint nicht definiert zu sein.

2. Fehler in Zeile 117? Aha, welche ist das? Bitte etwas genauer.

3. CodeTags verwenden!


----------



## teja (19. April 2004)

Die Medung bezieht sich auf den 5 Parameter von MapViewOfFile.

hMapObject ist als HANDLE definiert.


```
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	
	DWORD ThreadID;	
	HDC hdc;
	PAINTSTRUCT ps;   
	char tmessage[128];
	

	switch (message)
	{
	case WM_CREATE:
		hMapObject = CreateFileMapping ((HANDLE) 0xFFFFFFFF,
										 NULL,
										 PAGE_READWRITE,
										 0,
										 sizeof(HLA_TEST),
										 "shared_memory");
	   /*hMapObject = OpenFileMapping (FILE_MAP_READ,
                                        FALSE,
                                        "shared_memory");*/
	   if(hMapObject != NULL)
	   {
		   (LPVOID)MapView = MapViewOfFile (hMapObject,
											FILE_MAP_READ,
											0,
											0,
											0); ?
		   CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendeTest, MapView, 0, &ThreadID);
```


----------



## Kachelator (19. April 2004)

> Die Medung bezieht sich auf den 5 Parameter von MapViewOfFile.


  Glaube ich nicht - eher auf den Rückgabewert der Funktion (wg. '=').  Wie ist MapView definiert? Im neuen Schnipsel taucht es nicht mehr auf. Ich bin sicher, dass es mit dem Cast zusammenhängt.


----------



## basd (19. April 2004)

Ein Cast macht man in der Regel auf der rechten Seite des = 

```
(LPVOID)MapView = MapViewOfFile (hMapObject,
											FILE_MAP_READ,
											0,
											0,
											0); ?
```
Caste den Rückgabewert auf den Typ von MapView


----------

