Problème de passage de paramètres entre un prg VB5 et une DLL VC5 
Author Message
 Problème de passage de paramètres entre un prg VB5 et une DLL VC5

J'avais dj pos cette question prcdemment dans le groupe, mais n'avait
eu aucune rponse adquate. Il se pourrait que le problme n'ait pas de
rponse
et qu'un bug subsiste, soit dans VB, soit dans VC. Je repose tout de mme
ma
question, au cas o quelqu'un aurait une solution:
J'ai besoin de passer des informations de mon programme VB vers ma DLL VC,
et j'utilise une structure de donnes, dont je passe le pointeur en
paramtre de
la fonction d'change. Cette structure contient plusieurs autres
structures, qui
elles-mmes peuvent contenir d'autres structures. Elle est donc assez
complexe
de ce c?t l. La structure est totalement quivalente entre VB et VC, cd:
un integer
pour un short, un long pour un long, un byte pour un char, un string*n pour
un char[n].
Malgr tout ?a, je ne retrouve pas mes donnes dans la DLL, car elles ne
sont plus
"alignes" correctement en mmoire. Pourtant je compile ma DLL avec un
"struct
member alignment" gal 4, comme le fait normalement VB. Le problme
n'arrive
cependant pas quand dans mes structures de donnes il n'y a que des chaines
de
caractres. Quand j'introduis des valeurs entires, j'au un dcalage
chaque fois, et
suis donc oblig de recourir des filler dans ma structure.
Autre chose que j'ai remarqu, en rapport avec tout ?a: le passage de
tableaux de
chaines de caractres. Par exemple, si on dclare dans VB:
Tab_chaine(0 to 9) as string * 20
et que l'on dclare dans la DLL VC:
char[10][20] tab_chaine;
et si l'on inspecte la mmoire une fois arriv dans la DLL, on remarque que
c'est
carrment le foutoir. Par contre, si on passe par une structure
intermdiaire, il n'y a plus de problme:
Type chaine20_s
    valeur As String * 20
end type
tab_chaine(0 To 9) as chaine20_s

et dans VC:
char[10][20] tab_chaine;

Je ne sais pas si tout ?a est clair pour vous, mais si vous pensez avoir
dj
rencontr ce genre de problme, et peut-tre mme trouv une solution,
n'hsitez
pas m'en faire part. Pour ceux qui n'ont pas tout compris, je veux bien
fournir
plus de dtails la demande.
Merci d'avance ceux qui pourront m'aider.



Mon, 02 Apr 2001 03:00:00 GMT  
 Problème de passage de paramètres entre un prg VB5 et une DLL VC5
Salut,

Je n'ai jamais rencontrer le moindre probleme. Comment dclares-tu ta
fonction dans VB ?

La fonction dans ta DLL est bien de type __stdcall ?

Jerome

Quote:

>J'avais dj pos cette question prcdemment dans le groupe, mais n'avait
>eu aucune rponse adquate. Il se pourrait que le problme n'ait pas de
>rponse
>et qu'un bug subsiste, soit dans VB, soit dans VC. Je repose tout de mme
>ma
>question, au cas o quelqu'un aurait une solution:
>J'ai besoin de passer des informations de mon programme VB vers ma DLL VC,
>et j'utilise une structure de donnes, dont je passe le pointeur en
>paramtre de
>la fonction d'change. Cette structure contient plusieurs autres
>structures, qui
>elles-mmes peuvent contenir d'autres structures. Elle est donc assez
>complexe
>de ce c?t l. La structure est totalement quivalente entre VB et VC, cd:
>un integer
>pour un short, un long pour un long, un byte pour un char, un string*n pour
>un char[n].
>Malgr tout ?a, je ne retrouve pas mes donnes dans la DLL, car elles ne
>sont plus
>"alignes" correctement en mmoire. Pourtant je compile ma DLL avec un
>"struct
>member alignment" gal 4, comme le fait normalement VB. Le problme
>n'arrive
>cependant pas quand dans mes structures de donnes il n'y a que des chaines
>de
>caractres. Quand j'introduis des valeurs entires, j'au un dcalage
>chaque fois, et
>suis donc oblig de recourir des filler dans ma structure.
>Autre chose que j'ai remarqu, en rapport avec tout ?a: le passage de
>tableaux de
>chaines de caractres. Par exemple, si on dclare dans VB:
>Tab_chaine(0 to 9) as string * 20
>et que l'on dclare dans la DLL VC:
>char[10][20] tab_chaine;
>et si l'on inspecte la mmoire une fois arriv dans la DLL, on remarque que
>c'est
>carrment le foutoir. Par contre, si on passe par une structure
>intermdiaire, il n'y a plus de problme:
>Type chaine20_s
>    valeur As String * 20
>end type
>tab_chaine(0 To 9) as chaine20_s

>et dans VC:
>char[10][20] tab_chaine;

>Je ne sais pas si tout ?a est clair pour vous, mais si vous pensez avoir
>dj
>rencontr ce genre de problme, et peut-tre mme trouv une solution,
>n'hsitez
>pas m'en faire part. Pour ceux qui n'ont pas tout compris, je veux bien
>fournir
>plus de dtails la demande.
>Merci d'avance ceux qui pourront m'aider.



Mon, 02 Apr 2001 03:00:00 GMT  
 Problème de passage de paramètres entre un prg VB5 et une DLL VC5
Attention quand tu passe une structure , VB ne fait pas l'alignement des
membres sur 4.
Dans la structure, pour Byte il passe un Octet
pour un Integer 2, pour un Long 4.

Exemple:
soit une structure en Vb:

Type rec
    BytA as Byte
    IntC  as Integer
end type

Si On passe cette structure par reference une dll, Vb passe un pointeur
la DLL

Pointeur + 0 = BytA
Pointeur + 1 = Low byte de IntC
Pointeur + 2 = High byte de IntC

Il n'y a pas un alignement sur 4 octets.

En assembleur

Push ebp
Mov ebp, esp
Mov esi , [ebp + 8]   ---> esi est l'adresse de la structure

esi + 0 contient BytA
esi + 1 contient Low de intC
esi + 2 contient High de intC

DELEAU Jean-Marie



Tue, 03 Apr 2001 03:00:00 GMT  
 Problème de passage de paramètres entre un prg VB5 et une DLL VC5
Ok Jean-Marie,

Mais si la structure est la suivante ?

Type rec
    BytA as Byte
    IntC  as Integer
    dbl   As double
end type

dbl ne serra-t-il pas align sur un DWORD ?

Jerome

Quote:

>Attention quand tu passe une structure , VB ne fait pas l'alignement des
>membres sur 4.
>Dans la structure, pour Byte il passe un Octet
>pour un Integer 2, pour un Long 4.

>Exemple:
>soit une structure en Vb:

>Type rec
>    BytA as Byte
>    IntC  as Integer
>end type

>Si On passe cette structure par reference une dll, Vb passe un pointeur
>la DLL

>Pointeur + 0 = BytA
>Pointeur + 1 = Low byte de IntC
>Pointeur + 2 = High byte de IntC

>Il n'y a pas un alignement sur 4 octets.

>En assembleur

>Push ebp
>Mov ebp, esp
>Mov esi , [ebp + 8]   ---> esi est l'adresse de la structure

>esi + 0 contient BytA
>esi + 1 contient Low de intC
>esi + 2 contient High de intC

>DELEAU Jean-Marie



Tue, 03 Apr 2001 03:00:00 GMT  
 Problème de passage de paramètres entre un prg VB5 et une DLL VC5

J'ai t un peu excessif en disant que VB n'effectue pas
un alignement sur 4 quand il passe un UDT.
En fait il le fait, mais en regroupant les membres dans un
mme alignement.

Si un membre est 1 byte et le suivant un Integer,
Vb regroupe les 2 membres dans un mme alignement et
ajoute dans ce cas ci un zero pour remplir l'alignement.

Dans le cas suivant :

Type  Rec
 BytA  as Byte
 Intc  as Integer
 Dbl   as double
end type

VB passera
 BytA 1 octet
 Intc 2 octet
 1 octet de remplissage
 8 octets pour DBl

Jean-Marie



Wed, 04 Apr 2001 03:00:00 GMT  
 Problème de passage de paramètres entre un prg VB5 et une DLL VC5
VC aligne de la meme manire

Jerome

Quote:

>J'ai t un peu excessif en disant que VB n'effectue pas
>un alignement sur 4 quand il passe un UDT.
>En fait il le fait, mais en regroupant les membres dans un
>mme alignement.

>Si un membre est 1 byte et le suivant un Integer,
>Vb regroupe les 2 membres dans un mme alignement et
>ajoute dans ce cas ci un zero pour remplir l'alignement.

>Dans le cas suivant :

>Type  Rec
> BytA  as Byte
> Intc  as Integer
> Dbl   as double
>end type

>VB passera
> BytA 1 octet
> Intc 2 octet
> 1 octet de remplissage
> 8 octets pour DBl

>Jean-Marie



Wed, 04 Apr 2001 03:00:00 GMT  
 
 [ 6 post ] 

 Relevant Pages 

1. Pb de passage de paramètres entre VB et VC - exemple

2. Mettre à jour une structure de table de base de donnée mdb par code

3. impresión de un grafico o de un mschart con el obj printer

4. Problème de connexion avec une BD FoxPro sur XP.

5. impresión de un grafico o de un mschart con el obj printer

6. Problème de premier plan arrière plan avec un combobox MsForm2

7. Impossible de rajouter une référence à un projet VB.Net

8. Xceed (ocx de compression),pb pour supprimer un fichier d'une archive zip

9. Savoir le nombre de pages sorties s ur une imprimante graca à un script

10. voir un fichier dwg de autocad sur internet exploreur avec une application visual basic

11. VB et impression de doc word(pour changement de bac)

12. Modificar propiedades de un objeto conociendo el handle de su formulario

 

 
Powered by phpBB® Forum Software