Daten von Anwendung1 an Anwendung2 Übergeben



  • 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. 😃 😃



  • Jetzt mal ne ganz doofe frage:
    Brauch das ganze zeug nicht synchronisation?
    Durch closeHandle ist das file mapping doch schon wieder gelöscht bevor da jemand was lesen kann oder===)``?='???



  • Desswegen ja das _getch() schätze ich...
    Dann kann der User bestimmen wann der Speicherbereich gelöscht wird...


Anmelden zum Antworten