tr1 :: function WINAPI

时间:2010-02-09 13:33:09

标签: c++ winapi function tr1

如何在WINAPI调用约定中使用tr1 :: function? (至少在windows中)。我可以使用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 个答案:

答案 0 :(得分:2)

编译:

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

并且“info”上的内容与“info2”的内容相同,所以它似乎有效。

我的理解是用于实例化boost :: function的参数是其operator()的签名。它与包装的函数对象的功能的签名没有严格的关系。否则,它的好处将会丢失,因为boost :: function的实用程序正是能够包装在统一接口后面可调用的任何东西,而不管最终目标类型的细节。