Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2449 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1822324
Riot
Buy me a riot
Posté le 05-12-2008 à 10:59:08  profilanswer
 

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.
mood
Publicité
Posté le 05-12-2008 à 10:59:08  profilanswer
 

n°1822344
superbob56
Posté le 05-12-2008 à 11:34:36  profilanswer
 

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.
n°1822380
Riot
Buy me a riot
Posté le 05-12-2008 à 12:07:49  profilanswer
 

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.
n°1822463
Joel F
Real men use unique_ptr
Posté le 05-12-2008 à 14:33:03  profilanswer
 

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

n°1822532
Riot
Buy me a riot
Posté le 05-12-2008 à 15:55:35  profilanswer
 

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.
n°1822582
Joel F
Real men use unique_ptr
Posté le 05-12-2008 à 17:07:39  profilanswer
 

et dans celle de BOOST ?

n°1823181
Riot
Buy me a riot
Posté le 07-12-2008 à 15:40:01  profilanswer
 

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.
n°1823183
Riot
Buy me a riot
Posté le 07-12-2008 à 15:45:12  profilanswer
 

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.
n°1823199
Joel F
Real men use unique_ptr
Posté le 07-12-2008 à 16:29:12  profilanswer
 

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.

n°1823309
Riot
Buy me a riot
Posté le 07-12-2008 à 20:35:50  profilanswer
 

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.
mood
Publicité
Posté le 07-12-2008 à 20:35:50  profilanswer
 

n°1823389
Joel F
Real men use unique_ptr
Posté le 08-12-2008 à 09:23:11  profilanswer
 

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.

n°1823416
Riot
Buy me a riot
Posté le 08-12-2008 à 10:14:44  profilanswer
 

Ah ouais ok. Merci pour ton aide.


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[Résolu] Ne pas charger une page pdt la vérifi des variable de session[Résolu] [PHP] Soucis avec Header
[RESOLU] Parsing de CSV avec Text::CSV_XC ou à l'arrache[résolu] Runtime error sur une assignation de SUMIF
[Résolu] Vous avez dit Memcpy() ?![JS ] Conflit ***.js avec prototype.js
Compilation MySQL avec C++ Builder 2006 [Resolu][RÉSOLU]problème de Requète MySQL
[résolu] Remplacement d'1 caractère dans chaque nom de fic d'1 dossier[résolu]Maieuh pourquoi ça marche pas ?
Plus de sujets relatifs à : [résolu] Boost + convention d'appel __stdcall ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR