代码之家  ›  专栏  ›  技术社区  ›  QbProg

tr1::函数winapi

  •  3
  • QbProg  · 技术社区  · 15 年前

    如何将tr1::函数与winapi调用约定一起使用?(至少在窗户里)。我可以使用Visual C++ 9 SP1 Tr1或Boost的一个…

    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");
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   Éric Malenfant    15 年前

    编译:

    #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;
    }
    

    而“信息”上的内容和“信息2”上的内容一样,所以它似乎有效。

    我的理解是,用于实例化Boost::函数的参数是其运算符()的签名。它与所包装的函数对象的函数签名没有严格的关系。否则,它的好处将丢失,因为Boost::函数的实用程序能够准确地将任何可调用的内容包装在统一接口后面,而不管最终目标类型的细节如何。

    推荐文章