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:
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:
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:
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:
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:
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:
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.