OVH Cloud OVH Cloud

appel dll c++/visual basic

19 réponses
Avatar
cyril
Bonjour,

J'ai le petit qui suit. J'ai fait il y a quelques mois un programme
en Visual Basic (ben oui j'avais que ça sous la main) qui dessine des
fractales de Julia et Mendelbrot.
Pour accélérer le calcul, j'ai décidé de faire un dll en c++ (sous
borland c++ builder) chargée de faire la partie la plus bruitale du
travail, càd le camlcul itératif fait pour chaque point, je met le
code source à la fin du post.

Comme je n'avais pas visual basic, j'ai vérifié que ma dll marchait
bien en l'important dans un programme sous delphi, puisque j'avais pas
VB à disposition. Le petit programme delphi ne fait que tester
quelques valeurs mises 'en dur' dans le code, mais il m'a permis de
m'assurer que la dll marche bien.

Si ma fonction s'appelle 'calcul' dans le source, le compilateur en a
fait je ne sais trop pourquoi '_calcul' (c'est la première fois que je
compile une dll, et je connais quasi pas le c++).

Qu'a celà ne tienne, j'ai importé sous delphi la fonction et ça
marche, j'ai utilisé la ligne :

function _calcul(zzr , zzi,cr, ci, lim : double; imax : integer) :
integer; cdecl; external 'madll.dll';

Bon, maintenant, je n'ai plus c++ builder sous la main, mais
j'ai visual basic. J'essaie de faire la même chose en vb. Et là j'ai
un problème, c'est que ce crétin de compilateur vb considère le '_'
comme un caractère incorrect! Comment importer quand même ma fonction?

merci d'avance



#include <vcl.h>
#pragma hdrstop

typedef struct scomplexe {double re; double im;} complexe;

extern "C" __declspec(dllexport) int calcul(double, double, double,
double, double, int);

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{ return 1; }

double modulec(complexe z)
{ return (z.im*z.im + z.re*z.re); }

complexe carre(complexe z)
{ complexe zca = { z.re*z.re - z.im*z.im, 2*z.im*z.re };
return zca; }

complexe somme(complexe a, complexe b)
{ complexe s = {a.re + b.re, a.im + b.im};
return s; }

int calcul(double zzr, double zzi, double cr, double ci, double lim,
int imax)
{ int i=0;
complexe z={zzr,zzi}, c={cr,ci};
while ( (++i<imax)&&(modulec(z = somme(carre(z),c))<lim) );
return(i);
}




--
« Si quelqu’un a une crise de paludisme, il suffit qu’il prenne une
pioche et aille creuser la terre au soleil pour être guéri grâce à
sa conscience politique élevée. »
POL POT

9 réponses

1 2
Avatar
Fabien LE LEZ
On Fri, 20 Aug 2004 23:00:12 +0200, Pierre Maurette
:

fais une recherche sur "deuxième degré" dans google ?!
Il est certain que je manque d'humour. Dans "Le général est arrivé à

pied par la Chine", je demande "pourquoi un général?".


C'est le principe des templates : généraliser.


--
;-)


Avatar
Christophe de Vienne
Fabien LE LEZ wrote:
On Fri, 20 Aug 2004 21:39:29 +0200, Pierre Maurette
:


Ici, à cette signature évoquant on ne sait trop pourquoi un dirigeant
communiste cambodgien particulièrement sanguinaire, vous ajoutez un
chapeau annonçant [...]



N'accable pas trop un adolescent en plein recherche de repères...



Une petite recherche sur groups.google.fr te montrera que ce n'est pas
le cas...

A+

Christophe


Avatar
Fabien LE LEZ
N'accable pas trop un adolescent en pleine recherche de repères...



Et Christophe de Vienne a répondu :

Une petite recherche sur groups.google.fr te montrera que ce n'est pas
le cas...


Note que contrairement au mot anglais "teenager", le mot français
"adolescent" ne dit rien sur l'âge physique de l'intéressé.


--
;-)


Avatar
Pierre Maurette
Fabien LE LEZ a écrit:

N'accable pas trop un adolescent en pleine recherche de repères...



Et Christophe de Vienne a répondu :

Une petite recherche sur groups.google.fr te montrera que ce n'est pas
le cas...


Note que contrairement au mot anglais "teenager", le mot français
"adolescent" ne dit rien sur l'âge physique de l'intéressé.
Il existe quand même un néologisme éthymologiquement improbable pour

désigner l'adulte adolescent (sic):
http://www.google.fr/search?hl=fr&ie=UTF-8&q­ulescent&meta en particulier:
http://www.fluctuat.net/cyber/articles/tribus/adulescents1.htm
--
Pierre



Avatar
Fabien LE LEZ
On Sat, 21 Aug 2004 04:40:50 +0200, Pierre Maurette
:

Il existe quand même un néologisme éthymologiquement improbable pour
désigner l'adulte adolescent (sic):


Hors-sujet. Ne pas confondre l'adulte qui retombe en enfance, et
l'adolescent qui n'en est pas encore vraiment sorti.


--
;-)

Avatar
Pierre Maurette
Fabien LE LEZ a écrit:

On Sat, 21 Aug 2004 04:40:50 +0200, Pierre Maurette
:

Il existe quand même un néologisme éthymologiquement improbable pour
désigner l'adulte adolescent (sic):


Hors-sujet. Ne pas confondre l'adulte qui retombe en enfance, et
l'adolescent qui n'en est pas encore vraiment sorti.
Ah, oui. Je vois. Vous parlez des enseignants, par exemple...

--
Pierre


Avatar
Cyrille Karmann
Fabien LE LEZ disait:
On Sat, 21 Aug 2004 04:40:50 +0200, Pierre Maurette
:

Il existe quand même un néologisme éthymologiquement improbable pour
désigner l'adulte adolescent (sic):


Hors-sujet. Ne pas confondre l'adulte qui retombe en enfance, et
l'adolescent qui n'en est pas encore vraiment sorti.


"ce ne sont ni tout à fait des enfants, ni tout à fait des adultes. Ce
sont des enfultes. Ou des aldentes."

Je fu2ise parce que là...

--
Cyrille


Avatar
cyril

La solution Microsoft coté VB:
Declare Function calcul Lib "" Alias "_calcul" (ByVal etc...) As ...

Dans votre code C++Builder, vous (ou le Wizard) incluez la VCL, celà
semble inutile. A partir de cette constation, vous pourriez
télécharger C++5.5 (compilo de C++Builder 5) ou C++BuilderX (compilo
de C++Builder 6) et remettre votre DLL "à plat".
http://www.borland.com/products/downloads/download_cbuilder.html
http://www.borland.com/products/downloads/download_cbuilderx.html


Bien merci. Effectivement, là ca marche, Vb trouve bien le point
d'entrée dans ma dll.

Mais j'ai maintenant une erreur "convetion d'appel incorrecte".
Pourtant tout est bien adressé par valeur et ça marche sous dlephi
avec les même arguements.

bon, je recompilerais la dll lundi avec la VCL virée et d'autres
conventions d'appels.





--
"Le drame de l'homme se joue moins dans la certitude de son néant
que dans son entêtement à ne point s'y résigner."
R Jaccard, la tentation Nihiliste

Avatar
Pierre Maurette
cyril <meynier.cyril@(antispam)wanadoo.fr> a écrit:




La solution Microsoft coté VB:
Declare Function calcul Lib "" Alias "_calcul" (ByVal etc...) As ...

Dans votre code C++Builder, vous (ou le Wizard) incluez la VCL, celà
semble inutile. A partir de cette constation, vous pourriez
télécharger C++5.5 (compilo de C++Builder 5) ou C++BuilderX (compilo
de C++Builder 6) et remettre votre DLL "à plat".
http://www.borland.com/products/downloads/download_cbuilder.html
http://www.borland.com/products/downloads/download_cbuilderx.html


Bien merci. Effectivement, là ca marche, Vb trouve bien le point
d'entrée dans ma dll.

Mais j'ai maintenant une erreur "convetion d'appel incorrecte".
Pourtant tout est bien adressé par valeur et ça marche sous dlephi
avec les même arguements.

bon, je recompilerais la dll lundi avec la VCL virée et d'autres
conventions d'appels.
N'hésitez pas à Googler.

[ "visual basic" dll ] vous donne une trpotée de réponses, dont:
http://www.boondog.com/%5Ctutorials%5Cdlltutor%5Cdlltutor.htm
http://rp.developpez.com/vb/tutoriels/dll/


[ "visual basic" dll underscore ] vous amenait à la solution que je
vous ai proposé.

--
Pierre


1 2