IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Echange entre prg en VB et C++


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 97
    Par défaut Echange entre prg en VB et C++
    Bonjour
    nous avons quelques petits souci pour échanger des données entre un programme VB et un en C++.

    J'ai posté également dans le forum VB.

    voici la structure de données utilisée.
    en C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct
    {
    	short nbElem;						// Nombre d'éléments dans la FIFO
    	short idxEcr;						// index d'écriture
    	short idxLect;					// index de lecture
    	//TParam params[NB_ESPECES_FIFO];	// les paramètres
    }TFifo;
    et en VB

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Public Type TFifo
        NBELEM As Integer
        IDXECR As Integer
        IDXLECT As Integer
    End Type
    Nous travaillons en VB6, et donc le integer fait 16bits. C'est pour cela que nous avons mis un short en C. Nous avons vérifié, la taille totale de la structure elle fait bien 6 octets en c et en vb.


    La création de la mémoire partagée se fait en VB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
        hMemVision = CreateFileMapping(INVALID_HANDLE_VALUE, Null, PAGE_READWRITE, 0, LenB(pBufVision), _
        NOM_MEM_PARTAGEE_INFORMATIONS)
        If (hMemVision = 0) Then _
            Call PB_GLOBAL("IHM : ---> ERREUR CREATION MAPPING MEMOIRE VISION -> IHM")
     
     
        hBufVision = MapViewOfFile(hMemVision, FILE_MAP_ALL_ACCESS, 0, 0, LenB(pBufVision))
        If (hBufVision = 0) Then _
            Call PB_GLOBAL("IHM : ---> ERREUR CREATION VUE MAPPING VISION -> IHM")
    En C++, juste un Open
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    hMemVision=OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,NOM_MEM_PARTAGEE_INFORMATIONS);
    	if(hMemVision==NULL)
    	{
    		myErrExit("CLIENT: Erreur connexion mapping memoire param!\n");
    	}
    	else
    		printf("CLIENT: Mapping param connectee , ouverture vue\n");
     
    	// Création d'une vue dans cette mémoire partagée
    	pBufVision=(TFifo*)MapViewOfFile(hMemVision,FILE_MAP_ALL_ACCESS,0,0,sizeof(TFifo));
    	if(pBufVision==NULL)
    	{
    		myErrExit("CLIENT: Erreur creation vue mapping memoire param!\n");
    	}
    	else
    		printf("CLIENT: Vue mapping param creee, connexion mem action\n");
    --------------------
    Le Programme C++ écrit dans la FIFO, le VB consomme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    BOOL Pretraitement::ecritFifoApp(TFifo *pBuf, TYPE_RN params[], int espece)
    {
    	DWORD sortieMutVision;
    printf("FIFO APP2\n");
    	// Récupère le mutex des param
    //printf("Attend mutex vision ...");
    	sortieMutVision = WaitForSingleObject(hMutVision,INFINITE);
    //printf("OK \n");
    	switch(sortieMutVision)
    	{
    		case WAIT_OBJECT_0: // L'objet est dispo 
    			if(pBuf->nbElem==NB_ESPECES_FIFO) // Il n'y a plus de cases de vide, le nombre d'éléments max est atteint
    			{
    				printf("Plus de place pour ecrire\n");
    			}
    			else	// sinon il y a de la place donc on peut écrire
    			{
    				pBuf->nbElem++;
    				pBuf->idxEcr=1;
    				pBuf->idxLect=2;
    				printf("fifo ecrite en %d (idxL=%d) taille=%d\n",pBuf->idxEcr,pBuf->idxLect,sizeof(TFifo));
     
    				pBuf->idxEcr++;
    				if(pBuf->idxEcr==NB_ESPECES_FIFO) // Calcul le prochain indice
    					pBuf->idxEcr=0;
     
    				SetEvent(hEvenVision);			// et signalisation
    			}
     
     
    			// Relache le mutex
    			ReleaseMutex(hMutVision);
    			return TRUE;
    		break;
    		case WAIT_ABANDONED: // L'IHM s'est arrétée alors qu'elle possédait le mutex
    			ReleaseMutex(hMutVision);
    			return FALSE;
    		break;
    		case WAIT_TIMEOUT:
    			//printf("timeout ecrit fifo\n");
    			return FALSE;
    		break;
    		default:
    			return FALSE;
    		break;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CopyMemory ByVal pBufVision, hBufVision, LenB(pBufVision)
    =========
    Il y a eu un pseudo ihm mode console pour émuler l'ihm VB. Les échanges fonctionnent bien. Mais quand on passe à la vrai IHM ca ne marche plus.
    En lisant du code VB, les idxEcr et idxLect nous n'avons pas les valeurs écrites en C.

    Nous avons également affiché les handle du cöté C et VB. Ils sont différents. Il me semble qu'ils devraient identiques. Peut être cela vient de la conversion Handle en entier???

    Nous avons un mécanisme de communication dans l'autre sens et lui fonctionne bien et pourtant les valeurs des handles C et VB sont là aussi différentes.

    Donc voilà je suis complètement dans l'expectative.

    merci pour une aide charitable.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Les handles n'ont pas besoin d'être identiques. C'est tout ce que je peux te dire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Echanges entre prog vb et c++
    Par thierryG dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/12/2007, 19h30
  2. [FLASH 8] Echange entre php et flash
    Par jbidou88 dans le forum Dynamique
    Réponses: 1
    Dernier message: 18/12/2006, 09h35
  3. echange entre les couches
    Par manoushka dans le forum Hardware
    Réponses: 2
    Dernier message: 31/05/2006, 08h45
  4. 9.2 Echange entre serveurs
    Par lunab54 dans le forum Oracle
    Réponses: 1
    Dernier message: 24/12/2005, 17h38
  5. [c-linux]echange entre 2 sockets
    Par .:dev:. dans le forum Développement
    Réponses: 2
    Dernier message: 11/06/2004, 19h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo