Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 29
  1. #1

    Mappare una classe con MapViewOfFile

    Ciao ho fatto un software che contiene una classe di nome clienti, per motivi vari
    questa classe la devo condividere con un'altro software, in pratica i due programmi puntare nella stessa classe.
    Ho provato a fare questo codice ma quando faccio la mappatura della classe per inviarmi l'indirizzo della classe non me la invia...


    Codice SoftWare 1 dove creo la classe (clCliente e invio l'indirizzo al software 2):

    //Creo la classie + i Handle della mappatura
    HANDLE hMapMemoryObject;
    LPVOID pBufObject, pTempObject;
    Clienti clCliente = new Clienti( "Nome", "Cognome", 22 );
    hMapMemoryObject = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, "clienteprova" );
    pBufObject = MapViewOfFile( hMapMemoryObject, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE );
    pTempObject = (Clienti *)clCliente;
    CopyMemory(pBufObject1, pTempObject, sizeof(pTempObject));


    Codice SoftWare 2:

    HANDLE hMapMemoryObject;
    LPVOID pBufObject;
    Clienti clCliente;
    hMapMemoryObject = OpenFileMapping( FILE_MAP_ALL_ACCESS, TRUE, "clienteprova" );
    pBufObject = MapViewOfFile( hMapMemoryObject, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE );
    clCliente= (Cliente *)pBufObject;

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: Mappare una classe con MapViewOfFile

    Intanto non condividi una classe ma un oggetto di una certa classe (ovvero una istanza di una classe). Quindi i due programmi punteranno allo stesso oggetto di una determinata classe.

    Nessun indirizzo deve essere inviato da nessuna parte.

    Quando l'area di memoria condivisa viene mappata, i due processi ottengono un indirizzo che non deve essere necessariamente uguale, ma che "punta" agli stessi dati condivisi.

    Nel primo codice, nella linea

    CopyMemory(pBufObject1, pTempObject, sizeof(pTempObject));

    vedo che c'e' pBufObject1 invece di pBufObject e poi usi sizeof(pTempObject) che restituisce 4 essendo pTempObject un puntatore. Inoltre, bisogna vedere come e' dichiarata la classe, dato che se contiene puntatori, questi possono creare problemi.

    Nel secondo codice inoltre, utilizzi clCliente come se fosse un puntatore alla classe, quando non e' cosi' perche' hai scritto

    Clienti clCliente;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ops!!! Ho sbagliato a copiare, ecco il codice corretto

    Codice SoftWare 1 dove creo la classe (clCliente e invio l'indirizzo al software 2):

    //Creo la classie + i Handle della mappatura
    HANDLE hMapMemoryObject;
    LPVOID pBufObject, pTempObject;
    Clienti clCliente = new Clienti( "Nome", "Cognome", 22 );
    hMapMemoryObject = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, "clienteprova" );
    pBufObject = MapViewOfFile( hMapMemoryObject, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE );
    pTempObject = (Clienti *)clCliente;
    CopyMemory(pBufObject, pTempObject, sizeof(pTempObject));


    Codice SoftWare 2:

    HANDLE hMapMemoryObject;
    LPVOID pBufObject;
    Clienti clCliente;
    hMapMemoryObject = OpenFileMapping( FILE_MAP_ALL_ACCESS, TRUE, "clienteprova" );
    pBufObject = MapViewOfFile( hMapMemoryObject, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE );
    clCliente= (Clienti *)pBufObject;


    Per come faccio a mettere sulla variabile clCliente (Software 2) l'indirizzo di clCliente(Software 1)?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Paolo1985
    invio l'indirizzo al software
    Ti ho gia' detto che NON si invia nessun indirizzo ... non hai chiaro come funziona la condivisione della memoria ...

    ... e questo

    sizeof(pTempObject)

    e' sbagliato ... cosi' come nel secondo programma, per l'oggeto clCliente ...


    Ho il sospetto che tu non abbia letto il mio messaggio precedente ...

    Per come faccio a mettere sulla variabile clCliente (Software 2) l'indirizzo di clCliente(Software 1)?
    Non devi creare un oggetto anche nel secondo programma ... l'unico che crea l'oggetto e' il primo programma. Quindi devi solamente usare un puntatore ad un oggetto della classe ...

    Clienti *clCliente;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    OK grazio, allora fammi un esempio.....

    Perche non ci salto fuori.....

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ti avevo detto che dipende da come è fatta la classe ... non l'hai mostrata ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Eccola....


    class Cliente
    {
    private:
    AnsiString sNomeCliente;
    AnsiString sCognomeCliente;
    int iEtaCliente;

    public:
    // Constructor
    Cliente();
    Cliente( AnsiString sNome, AnsiString sCognome, int iEta );
    // Destructor
    ~Cliente();
    // Functions
    void SetNome( AnsiString sNome );
    AnsiString GetNome();
    void SetCognome( AnsiString sCognome );
    AnsiString GetCognome();
    void SetEta( int sEta );
    int GetEta();

    };

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quella classe AnsiString non posso usarla (non provo con C++ Builder) e non so se puo' essere utilizzata ...

    Ti faccio un esempio "di base", addirittura senza metodi che impostano/leggono membri privati ... puoi adattarlo tu ...

    Primo programma

    codice:
    #include <windows.h>
    
    class CCliente
    {
    public:
      char nome[100];
      char cognome[100];
      int eta;
    
      CCliente(char *xnome, char *xcognome, int xeta);
      ~CCliente();
    };
    
    CCliente::CCliente(char *xnome, char *xcognome, int xeta)
    {
      strcpy(nome, xnome);
      strcpy(cognome, xcognome);
      eta=xeta;
    }
    
    int main()
    {
      CCliente *cliente = new CCliente("Nome", "Cognome", 22);
      HANDLE hMapMemoryObject = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(CCliente), "clienteprova");
      LPVOID pBufObject = MapViewOfFile(hMapMemoryObject, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(CCliente));
      CopyMemory(pBufObject, cliente, sizeof(CCliente));
    
      printf("Attesa per esecuzione secondo programma ...\n");
      getchar();
      return 0;
    }

    Secondo programma

    codice:
    #include <windows.h>
    
    class CCliente
    {
    public:
      char nome[100];
      char cognome[100];
      int eta;
    
      CCliente(char *xnome, char *xcognome, int xeta);
      ~CCliente();
    };
    
    CCliente::CCliente(char *xnome, char *xcognome, int xeta)
    {
      strcpy(nome, xnome);
      strcpy(cognome, xcognome);
      eta=xeta;
    }
    
    int main()
    {
      HANDLE hMapMemoryObject = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(CCliente), "clienteprova");
    
      CCliente *cliente = (CCliente *)MapViewOfFile(hMapMemoryObject, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(CCliente));
    
      printf("%s %s %d\n", cliente->nome, cliente->cognome, cliente->eta);
    
      return 0;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Occorre indicare il linguaggio nel titolo, come da Regolamento.

    Qui l'ho aggiunto io.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    Lo fatto e funziona, il problema rimane!!!!

    Io apro il primo programma che mi mappa l'oggetto (clienti) e poi apro il secondo programma che va ha creare l'altro oggetto (clienti) e ci mette i dati dell'oggetto del primo programma..

    Il problema che se modifico i dati dell'oggetto (clienti) del primo programma nel secondo non riesco a vedere i dati aggiornato e viceversa, io vorrei per esigenza che se modifico i dati dell'oggetto (clienti), le modifiche si devono vedere anche nell'altro programma e viceversa!!!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.