[résolu] Boost + convention d'appel __stdcall ?

Boost + convention d'appel __stdcall ? [résolu] - C++ - Programmation

Marsh Posté le 05-12-2008 à 10:59:08    

Bonjour,
 
Je suis en train de réaliser une dll au format COM sous Visual 2005. Pour qu'elle soit au format COM, la convention d'appel doit être __stdcall.
Dans mon projet, j'aurais besoin de rajouter un peu de Boost, histoire de me simplifier la vie.
 
Le problème est que le compilateur m'envoie chier à l'édition de liens : j'ai des symboles externes Boost non-résolus alors que j'ai bien inclus le bon .lib.
En essayant divers solutions, je me suis rendu compte qu'en changeant la convention d'appel en __cdecl, le projet de compile correctement. Malheureusement je ne peux pas enregistrer ma DLL avec regsvr32, le format n'est pas le bon.
 
Auriez-vous une idée/solution ?
 
Merci d'avance.


Message édité par Riot le 08-12-2008 à 10:15:56

---------------
Be the one with the flames.
Reply

Marsh Posté le 05-12-2008 à 10:59:08   

Reply

Marsh Posté le 05-12-2008 à 11:34:36    

Ben déjà poste le code en question (ou au moins la partie problématique) parce que dis comme ça, c'est pas évident ...
(Question de routine : t'as cherché dans google ?)


---------------
By bob.
Reply

Marsh Posté le 05-12-2008 à 12:07:49    

Oui j'ai cherché de Google, mais rien de convainquant.
 
Pour le code :
 

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <boost/asio.hpp>
  4. #include <boost/bind.hpp>
  5. class Toto
  6. {
  7. ...
  8. void multicast();
  9. void handleReceiveMulticast( const boost::system::error_code& error, size_t bytes_recvd );
  10. boost::asio::io_service m_io_service;
  11. boost::asio::ip::udp::socket m_socket;
  12. boost::asio::ip::udp::endpoint m_sender_endpoint;
  13. enum { max_length = 1024 };
  14. char data_[max_length];
  15. };


 

Code :
  1. ...
  2. void CTransformFilter2InputPin::multicast()
  3. {
  4. boost::asio::ip::address listen_address = boost::asio::ip::address::from_string( "0.0.0.0" );
  5. boost::asio::ip::address& multicast_address = boost::asio::ip::address::from_string( "blabla" );
  6. // Create the socket so that multiple may be bound to the same address.
  7. boost::asio::ip::udp::endpoint listen_endpoint( listen_address, 4050 );
  8. m_socket.open( listen_endpoint.protocol() );
  9. m_socket.set_option( boost::asio::ip::udp::socket::reuse_address( true ) );
  10. m_socket.bind( listen_endpoint );
  11. // Join the multicast group.
  12. m_socket.set_option( boost::asio::ip::multicast::join_group( multicast_address ) );
  13. m_socket.async_receive_from(
  14.  boost::asio::buffer( data_, max_length ),
  15.  m_sender_endpoint,
  16.  boost::bind( &CTransformFilter2InputPin::handleReceiveMulticast, this,
  17.   boost::asio::placeholders::error,
  18.   boost::asio::placeholders::bytes_transferred ) );
  19. m_io_service.run();
  20. }
  21. void CTransformFilter2InputPin::handleReceiveMulticast( const boost::system::error_code& error, size_t bytes_recvd )
  22. {
  23. if( !error )
  24. {
  25.  std::cout.write( data_, bytes_recvd );
  26.  std::cout << std::endl;
  27.  m_socket.async_receive_from(
  28.   boost::asio::buffer( data_, max_length ), m_sender_endpoint,
  29.   boost::bind( &CTransformFilter2InputPin::handleReceiveMulticast, this,
  30.    boost::asio::placeholders::error,
  31.    boost::asio::placeholders::bytes_transferred ) );
  32. }
  33. }


 
Et voici ce que me dit le compilateur :

Code :
  1. 1>CTransformFilter2InputPin.obj : error LNK2001: symbole externe non résolu "class boost::system::error_category const & __stdcall boost::system::get_system_category(void)" (?get_system_category@system@boost@@YGABVerror_category@12@XZ)
  2. 1>CTransformFilter2InputPin.obj : error LNK2001: symbole externe non résolu "class boost::system::error_category const & __stdcall boost::system::get_generic_category(void)" (?get_generic_category@system@boost@@YGABVerror_category@12@XZ)
  3. 1>...\Debug\IsmaDescrFilter.dll : fatal error LNK1120: 2 externes non résolus


 
Comme dit précédemment, j'ai bien inclut boost_system-vc80-mt-1_36.lib dans les paramètres de link


---------------
Be the one with the flames.
Reply

Marsh Posté le 05-12-2008 à 14:33:03    

visual studio ??
as tu bien mis le type d'appel proprement dans les settings du projet ?

Reply

Marsh Posté le 05-12-2008 à 15:55:35    

Oui Visual Studio 2005.

 

Et oui, j'ai mis __stdcall comme convention d'appel dans les propriétés du projet (C++/Avancé/Convention d'appel).


Message édité par Riot le 05-12-2008 à 15:56:19

---------------
Be the one with the flames.
Reply

Marsh Posté le 05-12-2008 à 17:07:39    

et dans celle de BOOST ?

Reply

Marsh Posté le 07-12-2008 à 15:40:01    

J'ai récupéré l'installeur (http://www.boostpro.com/products/free) qui fournit les binaires. Je n'ai donc pas compilé moi-même Boost.


---------------
Be the one with the flames.
Reply

Marsh Posté le 07-12-2008 à 15:45:12    

J'ai aussi posé la question sur la ML boost-users, et effectivement il semblerait que je doive compiler Boost avec la convention d'appel désirée.
 
Je trouve que c'est pas du tout pratique. Ça serait la seule solution ?


---------------
Be the one with the flames.
Reply

Marsh Posté le 07-12-2008 à 16:29:12    

bah tu peut guere faire autrement. l'installeur basique de boost n'ets que ça : basique.
Pour les cas non-standards, reste l'instalateur manuel.
 
Enfin, perso, ca me choque pas plsu que ça sous linux.

Reply

Marsh Posté le 07-12-2008 à 20:35:50    

Oui ok, mais c'est pas ce que je voulais dire.
 
Ce que je me demandais, c'est s'il n'existe pas un moyen d'appeler une fonction "__cdecl" à partir d'une fonction "__stdcall".
Par exemple, est-ce qu'il n'existe pas un équivalent à "extern "C"" signifiant qu'on met du code C dans du code C++, pour les conventions d'appel.


---------------
Be the one with the flames.
Reply

Marsh Posté le 07-12-2008 à 20:35:50   

Reply

Marsh Posté le 08-12-2008 à 09:23:11    

Les conventions en __ modifie la manière dont les arguments sont passés au fonction (registre/piles/mémoires) au niveau du binaire.
 
Donc ta fonction __cdecl a du code x86 pr aller pécher les arguments à l'endroit X. Pas moyen depuis un source externe de modifier ça.

Reply

Marsh Posté le 08-12-2008 à 10:14:44    

Ah ouais ok. Merci pour ton aide.


---------------
Be the one with the flames.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed