OVH Cloud OVH Cloud

Fonction oublier

4 réponses
Avatar
Sivaller
j'ai ça :
"
// testdll2.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}


extern "C"
{
__declspec(dllexport) int _stdcall sivallertest(int i,int b)
{
return i*b;
}
}

extern int _stdcall sivallertest(int i,int b);
"
Le compilateur est censer de me générer une library avec vc++ avec la
routine "sivallertest" exporté.
Rapport :
Le compilateur m'exporte la routine "sivallertest" au nom de
"_sivallertest@8" au lieu de "sivallertest".

Conclusion sous delphi :
"program Project1;
{$APPTYPE CONSOLE}

function sivallertest(a,b : integer) : integer; stdcall external
'testdll2.dll';

begin
// Insérer le code utilisateur ici
writeln(sivallertest(5,20));
readln;
end.
"
Ne peux trouver la routine "sivallertest".

Conlusion :
On ne sait probablement pas créez des library multi-plateform (delphi,vc++).


Quelle (mot de passe) ou syntaxe apparament non documenté dans MSDN faut
t'il entrez dans "testdll.cpp" pour que le compilateur Vc++ m'exporte
la routine "sivallertest" au nom de "sivallertest" et non pas
"_sivaller@numeropoubelle" ??

cherche toujours ,,,,,

merci,

4 réponses

Avatar
Vincent Burel
"Sivaller" wrote in message
news:bnj78q$kbo$
j'ai ça :
"
// testdll2.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}


extern "C"
{
__declspec(dllexport) int _stdcall sivallertest(int i,int b)
{
return i*b;
}
}

extern int _stdcall sivallertest(int i,int b);
"
Le compilateur est censer de me générer une library avec vc++ avec la
routine "sivallertest" exporté.
Rapport :
Le compilateur m'exporte la routine "sivallertest" au nom de
"" au lieu de "sivallertest".

Conclusion sous delphi :
"program Project1;
{$APPTYPE CONSOLE}

function sivallertest(a,b : integer) : integer; stdcall external
'testdll2.dll';

begin
// Insérer le code utilisateur ici
writeln(sivallertest(5,20));
readln;
end.
"
Ne peux trouver la routine "sivallertest".



ben ouai !

Conlusion :
On ne sait probablement pas créez des library multi-plateform


(delphi,vc++).

mais si, mais vous exportez votre fonction mangled name (nom déterioré),
dans ce cas le linker fait comme il veut en fonction des option en cours...

si vous voulez exporter exactement le nom de la fonction, faites un fichier
DEF avec la liste de vos fonctions à exporter (et arréter d'utiliser
__declspec(dllexport))

VB
Avatar
Sivaller
Ca fonctionne , oui vous avez raison , faut éviter le _declspec(dllexport)
Vincent Burel a écrit dans le message :
bnj8sm$qh4$

"Sivaller" wrote in message
news:bnj78q$kbo$
> j'ai ça :
> "
> // testdll2.cpp : Defines the entry point for the DLL application.
> //
>
> #include "stdafx.h"
>
> BOOL APIENTRY DllMain( HANDLE hModule,
> DWORD ul_reason_for_call,
> LPVOID lpReserved
> )
> {
> return TRUE;
> }
>
>
> extern "C"
> {
> __declspec(dllexport) int _stdcall sivallertest(int i,int b)
> {
> return i*b;
> }
> }
>
> extern int _stdcall sivallertest(int i,int b);
> "
> Le compilateur est censer de me générer une library avec vc++ avec la
> routine "sivallertest" exporté.
> Rapport :
> Le compilateur m'exporte la routine "sivallertest" au nom de
> "" au lieu de "sivallertest".
>
> Conclusion sous delphi :
> "program Project1;
> {$APPTYPE CONSOLE}
>
> function sivallertest(a,b : integer) : integer; stdcall external
> 'testdll2.dll';
>
> begin
> // Insérer le code utilisateur ici
> writeln(sivallertest(5,20));
> readln;
> end.
> "
> Ne peux trouver la routine "sivallertest".

ben ouai !

> Conlusion :
> On ne sait probablement pas créez des library multi-plateform
(delphi,vc++).

mais si, mais vous exportez votre fonction mangled name (nom déterioré),
dans ce cas le linker fait comme il veut en fonction des option en


cours...

si vous voulez exporter exactement le nom de la fonction, faites un


fichier
DEF avec la liste de vos fonctions à exporter (et arréter d'utiliser
__declspec(dllexport))

VB




Avatar
Ambassadeur Kosh
il y a longtemps, on utilisait __export et __import. Borland faisait son
mangling dans son coin et MS forcement un mangling different dans le sien.
puis un jour, sont apparus les declspec(import) et declspec(export).
j'utilisais Borland C++ Builder, et force était de constater que les
__export d'une dll ne matchaient pas avec les declspec(import) d'un exe
client. et reciproquement. donc j'en avais conclu : declspec est une
"normalisation" pour que n'importe quelle dll de n'importe quel outils
puisse cooperer sans se casser les burnes pendant 3 plombes avec les
fichiers defs ou autres m..., concepts qui cassent facilement les c... et
plus encore quand on sait qu'ils apportent à peu pres autant que les
makefile faits à la main.

apparement il n'en est rien.

du coup, la question : "quel interet d'avoir viré __import pour mettre
declspec(import)"

voila voila...
Avatar
Patrick \Zener\ BRUNET
Bonjour.

"Ambassadeur Kosh" a écrit dans le message news:
bnleoo$14i$
<...>
du coup, la question : "quel interet d'avoir viré __import pour mettre
declspec(import)"




Si je me souviens bien, __import était une macro alors que declspec(import)
serait une extension au langage dûment intégrée au compilateur.
De toute manière, il y a des macros genre APIENTRY par dessus pour générer
ces trucs-là.
Alors moi comme je ne veux pas tout réécrire si ça change encore, j'ai mes
propres macros dans le genre DYNAMIC_EXPORT, qui facilitent l'exportation.
D'ailleurs il est aussi possible d'écrire une petite moulinette pour
rechercher cette clé dans les sources et générer automatiquement un .def,
laquelle moulinette peut être intégrée en prélude au cycle de compilation...

Bref, les normes sont faites pour être changées, et il faut essayer de
s'adapter.

cordialement,

Patrick BRUNET, sur le coup depuis Windows 2