4

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");
4

1 に答える 1

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のユーティリティは、最終的なターゲットのタイプの詳細に関係なく、統一されたインターフェイスの背後で呼び出し可能なものを正確にラップできるため、その利点が失われます。

于 2010-02-09T13:59:17.577 に答える