2010-02-09 4 views
3

Comment utiliser la fonction tr1 :: avec la convention d'appel WINAPI? (au moins dans les fenêtres). Je peux utiliser Visual C++ 9 SP1 TR1 ou celui de BOOST ...tr1 :: function WINAPI

typedef void (WINAPI *GetNativeSystemInfoPtr)(LPSYSTEM_INFO); 
HMODULE h = LoadLibrary (_T("Kernel32.dll")); 
GetNativeSystemInfoPtr fp = (GetNativeSystemInfoPtr) GetProcAddress (h,"GetNativeSystemInfo"); 
SYSTEM_INFO info; 
fp(&info); //works! 

// This doesn't compile 
function< void WINAPI (LPSYSTEM_INFO) > fb = (GetNativeSystemInfoPtr) GetProcAddress (h,"GetNativeSystemInfo"); 

Répondre

2

Cette compile:

#include <boost/function.hpp> 
#include <windows.h> 


int main(void) 
{ 
    typedef void (WINAPI *GetNativeSystemInfoPtr)(LPSYSTEM_INFO); 
    HMODULE h = LoadLibrary (("Kernel32.dll")); 
    GetNativeSystemInfoPtr fp = (GetNativeSystemInfoPtr) GetProcAddress (h,"GetNativeSystemInfo"); 
    SYSTEM_INFO info; 
    fp(&info); //works! 

    boost::function< void (LPSYSTEM_INFO) > fb = (GetNativeSystemInfoPtr) GetProcAddress (h,"GetNativeSystemInfo"); 
    SYSTEM_INFO info2; 
    fb(&info2); 


    return 0; 
} 

et le contenu de "info" est le même que celui de "Info2", donc ça a l'air de marcher. Je comprends que le paramètre utilisé pour instancier une fonction boost :: est la signature de son opérateur(). Il n'est pas strictement lié à la signature de la fonction de l'objet fonction qu'il enveloppe. Sinon, ses avantages seraient perdus, car l'utilité de boost :: function est justement de pouvoir envelopper tout ce qui peut être appelé derrière une interface uniforme, quels que soient les détails du type de la cible finale.

+0

Merci pour la solution et pour l'explication !! – QbProg