Daten von Anwendung1 an Anwendung2 Übergeben
-
Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
shared memory zb -> http://msdn2.microsoft.com/en-us/library/aa366551(VS.85).aspx
-
shared memory wär glaub ich schnell genug,
alternativ steht dir auch noch die windows message WM_COPYDATA zur verfügung,
damit ersparst du dir ne zusätzliche DLL.
-
Xantus schrieb:
shared memory wär glaub ich schnell genug,
alternativ steht dir auch noch die windows message WM_COPYDATA zur verfügung,
damit ersparst du dir ne zusätzliche DLL.von welchen dll reden sie, roflé?
-
rofler schrieb:
Xantus schrieb:
shared memory wär glaub ich schnell genug,
alternativ steht dir auch noch die windows message WM_COPYDATA zur verfügung,
damit ersparst du dir ne zusätzliche DLL.von welchen dll reden sie, roflé?
oh, pardon, habe wohl quer gedacht und von shared memory auf ein shared-data-segment geschlossen. dafür wär nämlich ne dll angebracht.
-
Noch eine Möglichkeit: FileMapping
-
Danke für die Beiträge.
ich hab das jetzt mal mit dem shared memory getestet. Das gegebene Beispiel funktioniert auch wunderbar. ich hab jetzt mal versucht das auf meine bedurfnisse zurecht zu schneiden, aber bin kläglich gescheitert.
ich hab vor ein double array aus 3600 Elementen zu kopieren.
dafür hab ich vorgendes gemacht:
anwendung 1:
int main() { double test[3000]; // <-- array das kopiert werden soll for(int i=0;i<3000;i++) test[i]=i; // <-- einfach mal blöd mit irgendwas füllen HANDLE hMapFile; LPCTSTR pBuf; hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // use paging file NULL, // default security PAGE_READWRITE, // read/write access 0, // max. object size BUF_SIZE, // buffer size szName); // name of mapping object if (hMapFile == NULL) { printf("Could not create file mapping object (%d).\n", GetLastError()); return 1; } pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, BUF_SIZE); if (pBuf == NULL) { printf("Could not map view of file (%d).\n", GetLastError()); return 2; } CopyMemory((PVOID)pBuf,test,sizeof(test)); // <-- mit dem sizeof bin ich mir nicht sicher. :( // CopyMemory((PVOID)pBuf, szMsg, strlen(szMsg)); <-- Original zeile _getch(); UnmapViewOfFile(pBuf); CloseHandle(hMapFile); return 0; }anwendung 2:
[...] <-- alles original belassen ShowMessage((double)pBuf[5]); // <--- mal zum test einen wert aus dem feld geholt. funzt aber nicht. (gibt nur 0 aus) // MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK); UnmapViewOfFile(pBuf); CloseHandle(hMapFile);jetzt die Preisfrage. Warum funzt das nicht so?
wo liegt der fehler?

-
Was sagt den GetLastError()?
Du Arbeitest mit Delphi richtig?
Is schon ne weile her mit mir und Delphi, aber kann ShowMessage int/double/float werte anzeigen?
-
shared memory zb -> http://msdn2.microsoft.com/en-us/library/aa366551(VS.85).aspx
hab ich von hier kopiert!!!
ShowMessage Wandelt alles ins passende format um.
ist denn die copyMemory funktion richtig?
-
Das ist ja gut und schön (wobei Copy&Paste eher schlecht ist) aber trotzdem stellen sich die Fragen ob
a. ShowMessage int/double/float anzeigen kann, oder nur Strings
b. welcher SystemErrorCode kommt.Schonmal mit dem Debugger durch dein programm gelaufen (mit haltepunkten)?
Arbeitest du jetzt eig mit Delphi oder nicht?
-
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-memnicht
UnmapViewOfFile( (LPTSTR)buff ); //"verbindungsabbau" zu shared-memschreiben...
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.