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

VB 6 et antérieur Discussion :

Echanges entre prog vb et c++


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 Echanges entre prog 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 C++.

    voici la structure de données utilisée.
    en C
    Code c : 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 vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public Type TFifo
        NBELEM As Integer
        IDXECR As Integer
        IDXLECT As Integer
        'PARAMS(NB_ESPECES_FIFO - 1) As TParam
    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 vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        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 c : 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 c : 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 vb : 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
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    bonjour,
    Nous avons également affiché les handle du cöté C et VB. Ils sont différents. Il me semble qu'ils devraient identiques.
    effectivement, ce n'est pas normal
    que donne l'essai avec une seule variable simple ?
    en tout cas, ce genre de partage doit fonctionner sous vb6 puisque j'y arrive même en vbs
    http://www.visualbasicscript.com/m_52915/tm.htm
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

Discussions similaires

  1. [FLASH 8] Echange entre php et flash
    Par jbidou88 dans le forum Dynamique
    Réponses: 1
    Dernier message: 18/12/2006, 09h35
  2. communication entre progs
    Par me_myself dans le forum Windows
    Réponses: 5
    Dernier message: 28/08/2006, 14h11
  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