Daten von Anwendung1 an Anwendung2 Übergeben



  • ich arbeite mit Codegear c++ builder 2007.

    ich bekomme keine fehlermeldung. der zeigt mir einfach nur an das nichts im feld drin ist.

    ShowMessage kann float/double werte so außgeben.

    Wenn du sagst copy&past ist schlecht. wie mach ichs anders?? am liebsten wär mir in anw.2 ein zeiger der auf das feld in anw.1 zeigt. aber hab keinen plan wie das gehen soll.



  • Also ich mache es quasi ähnlich wie Copy&Paste nur lese ich mir erstmal alles genau durch, überlege was wofür ist, tippe meinen Code (nach dem muste von MSDN z.B.) und kommentiere alles was ich noch nie gemacht habe, ich Tippe alles von Hand, kein STRG+C u. STRG+V so kann ich gleich meine Formatierung einbringen.

    Also ich programmiere in C und war gerade auf dem Weg so etwas zu suchen(shared memory), und ich habe das Schreiben in diesen geteilten Speicher fertig ohne Compilererror, ich musste eine Zeile anders machen als bei MSDN:

    LPCTSTR		pBuf;
    

    wurde zu

    LPTSTR		buff;
    

    dann brauchte ich bei

    UnmapViewOfFile( buff );	//"verbindungsabbau" zu shared-mem
    

    nicht

    UnmapViewOfFile( (LPTSTR)buff );	//"verbindungsabbau" zu shared-mem
    

    schreiben...

    Programmierst du auch CPP?

    Dass du keine Fehlermeldung bekommst ist klar, aber gibt es in CPP kein GetLastError was eine Zahl ist, und mit hilfe der MSDN kannst du erkennen was genau es ist...

    Ich werde jetzt das auslesen Staraten, wenn es bei mir klappt poste ich den Code mal...



  • ich programier C++ .
    und GetLastError ruf ich auch öfters auf.
    Aber wenn kein error kommt, kann auch keiner angezeigt werde.

    Danke.



  • mail-slot vll.



  • GetLastError zeigt 0 an wenn die Funktion gut gelaufen ist.
    Hast du GetLastError in irgendeiner Bedingung?



  • getlasterror ist in einer bedingung.

    z.B.

    if (pBuf == NULL) 
       { 
          printf("Could not map view of file (%d).\n", 
                 GetLastError()); 
          return 2;
       }
    

    ich hab jetzt getlasterror auch mal ohne bedingung aufgerufen und der rückgabewert ist eine 0;



  • aber irgendwie blick ich momentan nicht ganz durch.

    Also nochmal zusammengefasst. ich hab mir das beispiel in 2 anwendungen kopiert (ob jetzt gut oder schlecht mal dahingestellt).

    hab das ganze so getestet und hat auch funktioniert. ( zur info: das beispiel übergibt ein char* feld).

    Nachdem das ganze funktioniert hat, hab ich mir gedacht, was mit char funktioniert muss ja auch mit double funktionieren.

    daraufhin hab ich mir ein doublefeld angelegt und versucht das zu kopieren. aber ich bin mir nicht so ganz sicher ob die CopyMemory funktion so richtig ist.

    ich frag mich jetzt schon die ganze zeit warum die letzt 10 post über getlasterror gingen!?!?

    Ich hab das ganze jetzt so verstanden das pBuf in anwendung 1 einen Adressbereich freigibt, auf dem ich mit Anwendung 2 drauf zugreifen kann. Die zugriffrechte scheinen zu funktionieren, nur find ich mit anwendung 2 die daten nicht aus anwendung 1.

    Etwas kompliziert, aber das ist momentan stand der dinge, würde ich sagen.



  • wie haben sie die funktion ShowMessage implementiert?



  • Es ging mir um GetLastError weil ich (persönlich) sicher sein wollte das das 0 ist, das hast du nur nie geschrieben. 😉

    Das es mit einem Char* vorher ging währe auch eine Hilfreiche info gewesen.

    Hast du mal einfach

    cout << pBuf[0];
    

    gemacht? (kann sein das die tags falschrum sind)

    Wenn es das nicht is... dann könntest du eventuell ja mal den ganzen code beider beispielprogramme posten, vlt ist da irgendwo noch was...

    Ansonsten würde mir halt auf die schnelle nichts einfallen.

    Ich habe das jetzt vollendet, das Puzzle 😉
    Ich habe folgendes:

    int main( void )
    	//Diese Funktion schreibt in einen geteilten Speicherbereich, wenn dieser Speicherbereich beschrieben ist, wird aus einem anderen Programm eine
    	//Email gesendet.
    {
    	HANDLE		shareMem = 0;//handle zum Speicher
    	LPTSTR		buff; //unbekannt
    
    	shareMem = 	CreateFileMapping(
    					INVALID_HANDLE_VALUE,   //geteileter Speicher
    					NULL,					//std security attributes
    					PAGE_READWRITE,			//lese und schreibzugriff
    					0,						//maximale größe des objekts
    					buffSize,				//buffergröße
    					buffName				//buffername
    				);
    	if( NULL != shareMem )
    	{
    		buff = 	(LPTSTR)MapViewOfFile(		//"verbindungsaufbau" zu shared-mem
    					shareMem,				//handle zu dem Speicher
    					FILE_MAP_ALL_ACCESS,	//zugriffsrechte
    					0,						//word's high-order offset
    					0,						//word's low-order offset
    					buffSize				//größe des speichers/zu schreibenden buffers
    				);
    		if( NULL != buff )
    		{
    			CopyMemory(					//kopiert einen speicherbereich zu einem anderen
    				(PVOID)buff,			//startadresse des ziel-speicherbereiches
    				TEXT("1"),				//startadresse des source-speicherbereiches
    				strlen( TEXT("1") )		//größe des source-speicherbereiches
    			);
    			printf( "." );
    			Sleep( 10000 );
    			printf( "." );
    
    			UnmapViewOfFile( buff );	//"verbindungsabbau" zu shared-mem
    			CloseHandle( shareMem );
    		}
    		else
    			printf( "MapViewOfFile: %d\n", GetLastError() );
    	}
    	else
    		printf( "CreateFileMapping: %d\n", GetLastError() );
    }
    

    und

    BOOL shouldSend( void )
    {
    	HANDLE		shareMem = 0;//handle zum Speicher
    	LPTSTR		buff; //unbekannt
    	BOOL		retValue = FALSE;
    
    	shareMem = 	OpenFileMapping(
    					FILE_MAP_ALL_ACCESS,	//vollzugriff
    					FALSE,					//namen nicht vererben
    					buffName				//buffername
    				);
    	if( NULL != shareMem )
    	{
    		buff = 	(LPTSTR)MapViewOfFile(		//"verbindungsaufbau" zu shared-mem
    					shareMem,				//handle zu dem Speicher
    					FILE_MAP_ALL_ACCESS,	//zugriffsrechte
    					0,						//word's high-order offset
    					0,						//word's low-order offset
    					buffSize				//größe des speichers/zu schreibenden buffers
    				);
    		if( NULL != buff )
    		{
    			if( "1" == buff )
    				retValue = TRUE;
    
    			CopyMemory(					//kopiert einen speicherbereich zu einem anderen
    				(PVOID)buff,			//startadresse des ziel-speicherbereiches
    				TEXT("0"),				//startadresse des source-speicherbereiches
    				strlen( TEXT("0") )		//größe des source-speicherbereiches
    			);
    
    			UnmapViewOfFile( buff );	//"verbindungsabbau" zu shared-mem
    			CloseHandle( shareMem );
    		}
    		else
    			printf( "MapViewOfFile: %d\n", GetLastError() );
    	}
    	else
    		printf( "OpenFileMapping: %d\n", GetLastError() );
    
    	return retValue;
    }
    

    Warum das trennen wichtig ist liegt daran das das Programm was die Email sendet, keine Admin rechte haben darf, das andere aber welche benötigt.
    Jetzt habe ich ein kleines problem:
    so eine Aktion benötigt von beiden Seiten Adminrechte... Wieso?



  • was reden sie nun von adminrechten und e-mails? von diesen problemen war bisher überhaupt keine rede. ich muss sagen, sie verwirren mich! das problem liegt in der implementation der funktion ShowMessage.



  • Das ist richtig, aber eh ich wieder sinnlos irgendwelche Threads erstelle, habe ich gedacht wenns hier (es geht in diesem thread nicht nur um ShowMessage sondern um datentransver zweier applikationen) schon um sowas geht, kann ich das hier gleich reinschreiben...

    Ich werde -um keinen zu verwirren- mal ein neues Thread aufmachen

    Und bitte, bei allem was gut und schlecht ist, siezen "sie" mich bitte nicht ja? 😉 Ich bin erst 17 🙂

    Wie gesagt ein wenig Code könnte eventuell hilfreich sein(neuerer und ein wenig mehr code als der letzte gepostete schnippsel)



  • lippoliv schrieb:

    Hast du mal einfach

    cout << pBuf[0];
    

    gemacht? (kann sein das die tags falschrum sind)

    Das war echt mal ne idee, das ich darauf nicht gekommen bin 🙄

    Also vergessen wir mal das ganze drumherum

    cout << test[0] ;                                         // <-- das macht die ausgabe 300,4
       CopyMemory((PVOID)pBuf,&test[0],sizeof(double));     //  <-- Hier steckt der Wurm drin
       cout << (double)pBuf[0];                                  //  <-- das macht die ausgabe 102
    

    ich hoffe das ist jetzt verständlich. ich kann später von mir aus acuh noch den kompletten quelltext posten. aber jetzt bitte erst mal sagen was da falsch ist.



  • JBOpael schrieb:

    cout << test[0] ;                                         // <-- das macht die ausgabe 300,4
    CopyMemory((PVOID)pBuf,&test[0],sizeof(double));     //  <-- Hier steckt der Wurm drin
    cout << (double)pBuf[0];                                  //  <-- das macht die ausgabe 102
    

    ich würde mal folgendes versuchen:

    cout << test[0] ;                                         // <-- das macht die ausgabe 300,4
    CopyMemory((PVOID)pBuf,test[0],sizeof(double));     //  <-- Hier steckt der Wurm drin
    cout << (double)pBuf[0];                                  //  <-- das macht die ausgabe 102
    

    Mit test[0] gibst du quasi schon ne adresse an, die da währe &test+(0*sizeof(double)) (Pointer ist bei mir nicht mehr soooo aktuell müste aber stimmen)



  • &test[0] entspicht test gibt beides die adresse vom ersten element.

    test[0] gibt den inhalt des ersten elements. Aber ich muss der funktion ja die adresse geben, der mit ab startadresse kopieren kann.

    deshalb muss ich ja von pBuf auch die adresse übergeben.

    habs trotzdem versucht, gibt compiler fehler (Typumwandlung).



  • Ah stimmt...
    hattest du auch mall &test und dann cout pBuf[0] versucht?



  • geht alles nichts. ist alles rätselraten.

    kennt sich denn damit keiner aus?



  • N kleiner workaround (nich sehr geil, allerdings solang du keine vernünftigen Antworten bekommst) währe den double in ein char* zu schreiben und den zu übertragen, du sagtest es würde gehen...



  • 😃 😃 😃 😃 👍 👍 👍

    Ich habs geschafft!!! Es geht!!!!!!!!! 😃 😃 😃

    pBuf ist ja vom Typ LPTSTR daraus hab ich einen double zeiger (double*) gemacht. alles andere auch darauf angepasst (bei beiden anwendungen) und nu funzt es!!!!



  • Das bedeutet der kann auch INT sein ja? Interessant... Cool.

    Wer suchet der findet.



  • Also nochmal für alle:

    Anwendung 1 (Konsolenprogramm):

    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <iostream.h>
    
    #define BUF_SIZE 30000  //<--  puffergröße für 3750 Werte
    
    TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
    double test[3600];             // <--array das kopiert werden soll
    
    int main()
    {
    	for(int i=0;i<3600;i++)
    		test[i]=i;         //  <-- Mit etwas füllen
    
       HANDLE hMapFile;
    
       double *pBuf;
    
       hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, szName);
    
       if (hMapFile == NULL)
       {
    	  printf("Could not create file mapping object (%d).\n",GetLastError());
    	  return 1;
       }
       pBuf = (double*) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS,	0, 0, BUF_SIZE);
    
       if (pBuf == NULL)
       {
    	  printf("Could not map view of file (%d).\n",GetLastError());
    	  return 2;
       }
       cout << sizeof(double);
       CopyMemory(pBuf,test,3600*sizeof(double));
    
       _getch();
    
       UnmapViewOfFile(pBuf);
    
       CloseHandle(hMapFile);
    
       return 0;
    }
    

    anwendung 2 (BCB2007) :

    #define BUF_SIZE 30000
    
    void __fastcall TForm_Main::Button2Click(TObject *Sender)
    {
    	TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
    
       HANDLE hMapFile;
       double *pBuf;
    
       hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,szName);
    
       if (hMapFile == NULL) 
       {
    	  String msg;
    	  msg.printf("Could not open file mapping object (%d).\n",
    	  GetLastError());
    	  ShowMessage(msg);
    	  return;
       }
    
       pBuf = (double*) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
    
       if (pBuf == NULL)
       {
    		String msg;
    		msg.printf("Could not map view of file (%d).\n",GetLastError());
    		ShowMessage(msg);
    		return;
       }
    		Label1->Caption=pBuf[2];    //  <--- zum testen einen wert auf ein Label gelegt.
    
       UnmapViewOfFile(pBuf);
    
       CloseHandle(hMapFile);
    
    }
    

    Danke an alle. 😃 😃


Anmelden zum Antworten