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.