tr1 :: функция WINAPI - PullRequest
       14

tr1 :: функция WINAPI

3 голосов
/ 09 февраля 2010

Как я могу использовать tr1 :: function с соглашением о вызовах WINAPI? (по крайней мере, в окнах). Я могу использовать Visual C ++ 9 SP1 TR1 или BOOST's ...

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 Ответ

2 голосов
/ 09 февраля 2010

Это компилируется:

#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, является сигнатурой его оператора (). Это не строго связано с сигнатурой функции объекта функции, которую она оборачивает. В противном случае его преимущества были бы потеряны, поскольку утилита boost :: function позволяет точно обернуть все, что можно вызвать, в единый интерфейс, независимо от деталей типа конечной цели.

...