Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ tr1::函数WINAPI_C++_Winapi_Function_Tr1 - Fatal编程技术网

C++ tr1::函数WINAPI

C++ tr1::函数WINAPI,c++,winapi,function,tr1,C++,Winapi,Function,Tr1,如何使用带有WINAPI调用约定的tr1::函数?(至少在windows中)。我可以使用Visual C++ 9 SP1 Tr1或Boost的一个…< /P> typedef void (WINAPI *GetNativeSystemInfoPtr)(LPSYSTEM_INFO); HMODULE h = LoadLibrary (_T("Kernel32.dll")); GetNativeSystemInfoPtr fp = (GetNativeSystemInfoPtr) GetProcAd

如何使用带有WINAPI调用约定的tr1::函数?(至少在windows中)。我可以使用Visual C++ 9 SP1 Tr1或Boost的一个…< /P>
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");
typedef void(WINAPI*GetNativeSystemInfoPtr)(LPSYSTEM\u信息);
HMODULE h=LoadLibrary(_T(“Kernel32.dll”);
GetNativeSystemInfoPtr fp=(GetNativeSystemInfoPtr)GetProcAddress(h,“GetNativeSystemInfo”);
系统信息;
计划生育和信息//作品
//这是不可编译的
函数fb=(GetNativeSystemInfo)GetProcAddress(h,“GetNativeSystemInfo”);
这将编译:

#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;
}
#包括
#包括
内部主(空)
{
typedef void(WINAPI*GetNativeSystemInfoPtr)(LPSYSTEM_信息);
HMODULE h=LoadLibrary((“Kernel32.dll”);
GetNativeSystemInfoPtr fp=(GetNativeSystemInfoPtr)GetProcAddress(h,“GetNativeSystemInfo”);
系统信息;
fp(&info);//有效!
boost::函数fb=(GetNativeSystemInfo)GetProcAddress(h,“GetNativeSystemInfo”);
系统信息2;
fb(和info2),;
返回0;
}
“信息”上的内容与“信息2”上的内容相同,因此它似乎有效


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

感谢您提供的解决方案和解释!!