2010-06-29 4 views
2

J'ai une bibliothèque (C++) qui a quelques fonctions API. L'un d'eux est déclaré comme __cdecl, mais obtient un pointeur de fonction de __stdcall. Quelque chose comme:Les conventions d'appel mixtes font des erreurs de compilation

typedef int (__stdcall *Func)(unsigned char* buffer); 
//... 
int ApiFunc(Func funcPtr); //This is __cdecl since it is an 'extern "C"' library and the calling convention is not specified 

Puis - j'ai un projet C++ exécutable qui utilise cette bibliothèque, mais ne remet pas l'API ci-dessus ou utilise le type Func.

Après avoir modifié la convention d'appel de Func-__stdcall, je reçois l'erreur de compilation suivante:

error C2995: 'std::pointer_to_unary_function<_Arg,_Result,_Result(__cdecl *)(_Arg)> std::ptr_fun(_Result (__cdecl *)(_Arg))' : function template has already been defined c:\program files\microsoft visual studio 8\vc\include\functional

Toute idée de ce que pourrait-il être?

Merci d'avance !!

Répondre

1

Err .. ils sont incompatibles. Vous devez spécifier la même convention d'appel des deux côtés de l'appel. Sinon, tenter d'appeler fera exploser la pile de la machine.

1

Ils sont compatibles, sous Windows au moins (et sous Linux il n'y a pas du tout __stdcall ...) Le problème était que, par erreur, la re-définie bibliothèque __stdcall pour la compatibilité avec Linux, comme:

#ifndef __MYLIB_WIN32 
//Just an empty define for Linux compilation 
#define __stdcall 
#endif 

Le projet exe inclut cette définition et __MYLIB_WIN32 n'y était pas défini, mais uniquement dans la bibliothèque. Modification de la définition ci-dessus à:

#ifndef WIN32 
//Just an empty define for Linux compilation 
#define __stdcall 
#endif 

et tout fonctionne bien.

Merci à tous.

Questions connexes