Message-ID: <38542FFF.B0852EAD@free.fr> Date: Mon, 13 Dec 1999 00:30:07 +0100 From: Laurent longre X-Mailer: Mozilla 4.7 [fr] (Win95; I) X-Accept-Language: fr MIME-Version: 1.0 Subject: Re: api win32 References: <8314pp$di$1@jaydee.iway.fr> Content-type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Newsgroups: microsoft.public.fr.excel NNTP-Posting-Host: lyon1-53-196.dial.proxad.net 212.27.53.196 Path: cppssbbsa01.microsoft.com!cppssbbsa04 Lines: 37 Xref: cppssbbsa01.microsoft.com microsoft.public.fr.excel:19598 Salut, * La raison en est la suivante : sous VBA, quand on passe une variable String à une fonction (API ou autre), il s'agit d'une variable de type BSTR, dont la structure est la suivante: 1er champ (octets 1 à 4) : adresse de la chaîne 2ème champ (octets 5 à X) : chaîne de caractères elle-même (terminé par un caractère nul). Si on passait la variable par valeur, on transmettrait un pointeur vers le premier champ, donc un pointeur vers un pointeur vers la chaîne. La fonction API, qui s'attend à recevoir un pointeur direct, n'apprécierait pas trop et le plantage est presque garanti. En passant la variable par valeur, on transmet en revanche la valeur du premier champ, qui est bien un pointeur direct vers la chaîne. En clair, c'est un faux ByVal qui revient au même qu'un vrai ByRef. Et il est absolument nécessaire de transmettre toutes les variables String aux fonctions API "par valeur" dans 95% des cas. Laurent * a écrit : > > bonjour, > > ma question est la suivante : > > pourkoi ds les appels d'api windows il y a des ByVal ki fonctionnent comme > des Byref > > exemple ds GetWindowsPathname ou kelke chose de ce genre on a > Byval path as string, byval longueur > > on envoie une chaine non vierge exemple chaine(100,"*") > et la function nous retourne le chemin de windows c:\windows par exemple.... > > et ca a ete declare avec un byval.... > > je ne comprends pas..... ;-)