je développe une dll en c (avec visual C++) utilisable sous vb mais je rencontre quelques difficultés, je vais essayer d'être le plus clair possible :

dans mon source c j'utilise une structure à allocation dynamique pour placer des infos d'un fichier en accès binaire(style carnet d'adresse)

d'abord le code en c :

la structure ressemble à ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
struct FICHE
{
    long ID;
    char *Nom;
    char *Prenom;
    char *Adresse;
    int    Age;
    .
    .
}
ma fonction que j'exporte pour vb est la suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
int _stdcall ReadFiche(char *FileName, FICHE *Personne)
{
    FILE *pFile;
    .
    . ici je vous passe les modalitées d'ouverture du fichier
 
    Personne = ReadData(pFile,  Personne->ID);
 
    return 0;
}
ReadData est une routine qui retourne un pointeur sur une structure FICHE générée grace à l'ID de la fiche,
sa déclaration est la suivante : FICHE *ReadData(FILE *pFile, long ID)


sous vb maintenant g déclarer ma fonction ReadFiche comme ça:
Private Declare Function ReadFiche Lib "fiche.dll" (ByVal szFile As String, ByRef Personne As FICHE) As Long

et dans une sub de mon source vb je tente de lire une fiche avec
Sub ...
Dim Personne as FICHE
Dim iRet as long

Personne.Id = 183
iRet = ReadFiche(MonFichier, Personne)
End Sub

je place l'ID d'une fiche à lire (dans l'exemple 183) dans la structure Personne en souhaitant qu'à la fin de l'exécution de la fonction ReadFiche la fiche soit remplie.
mais voilà le début des problèmes :

sous vb en mode debug, au retour de la fonction il ya juste Personne.Id = 183 le reste des champs sont vides...
je passe donc un coup de debug sous vc++ et surprise :les fonctions ReadFiche et ReadData se sont bien dérouler au moment du return 0 de ReadFiche, 'Personne' est remplie correctement mais l'adresse du pointeur a changé donc "normal"??? qu'aucune info soit présente dans la structure Personne sous vb, elle pointe ailleurs (pour ma part rien que ça c pas logique)

alors voici ma question : comment je fait pour que la structure Personne soit bien remplie ??????

noter qu'avant de poster g fait ça comme variante mais ça marche pas :

passer par une fiche temporaire puis, pointer Personne sur cette nouvelle fiche comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
int _stdcall ReadFiche(char *FileName, FICHE *Personne)
{
    FILE *pFile;
    FICHE *tmp_Personne
    .
    . 
    tmp_Personne = ReadData(pFile,  Personne->ID);
 
    memmove(Personne, tmp_Personne, sizeof(*tmp_Personne));
 
    return 0;
}
la fonction s'éxécute correctement (Personne est bien rempli) mais apparement quand il retourne sous vb ya un bug :
j'ai un message d'erreur du style User breakpoint called from code at 0x.....
et dans la fenetre debug de vc++ il y a :
HEAP[Projet1.exe]: Invalid Address specified to RtlSizeHeap( 00140000, 00DB1E5C )

g tenter aussi en changeant ma fonction pour qu'elle devienne comme ça :
FICHE *_stdcall ReadFiche(char *FileName, long ID)
mais la un autre prob est survenu les paramètres FileName et ID sont vides....? heu je ne vois pas le 'pourquoi' de ce bug.

merci d'avoir pris le temps de lire jusqu'au bout.