gpt4 book ai didi

c++ - 将 std::bind 与 __stdcall 函数一起使用

转载 作者:太空狗 更新时间:2023-10-29 21:25:50 26 4
gpt4 key购买 nike

如何在 __stdcall 函数上使用 std::bind(而不是 boost::bind),或者在当前实现中甚至可能吗?当我尝试编译以下示例时:

std::function<LRESULT __stdcall(int, WPARAM, LPARAM)> func;
func = std::bind(&EventListener::myhook, this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3);

或相同,但将 func 声明为:

std::function<LRESULT(int, WPARAM, LPARAM> func;

给我奇怪的构建输出(我在下面包含)。有一种非常恶心的方法可以让它编译:

decltype(std::bind(&EventListener::myhook, nullptr, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3))* HookCallbackPointer;
HookCallbackPointer proc;

proc = reinterpret_cast<HookCallbackPointer>
(&std::bind(&EventListener::myhook, this,
std::placeholders::_1,
std::placeholders::_2,
std::placeholders::_3));

但它不允许我这样调用函数 (*proc)(0,0,0);。这很可悲。所有这一切的发生只是因为 func - myhook - 声明为 __stdcall。当然,我可以只写一个肮脏的汇编 hack,它将在 func 的末尾压入 4 个双字,这将“使”它成为 __stdcall,但我对此不太确定,而且这是更糟糕的方式。

1>D:\bin\Visual Studio\VC\include\xrefwrap(431): error C2440: 'return' : cannot convert from 'std::_Do_call_ret<_Forced,_Ret,_Funx,_Btuple,_Ftuple>::type' to 'LRESULT'
1> with
1> [
1> _Forced=false,
1> _Ret=void,
1> _Funx=__w64 long (__stdcall EventListener::* )(int,WPARAM,LPARAM),
1> _Btuple=std::tuple<EventListener *,std::_Ph<1>,std::_Ph<2>,std::_Ph<3>>,
1> _Ftuple=std::tuple<int &,WPARAM &,LPARAM &,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> Expressions of type void cannot be converted to other types
1> D:\bin\Visual Studio\VC\include\functional(239) : see reference to function template instantiation '_Ret std::_Callable_obj<_Ty>::_ApplyX<_Rx,int,__w64 unsigned int,__w64 long>(_V0_t &&,_V1_t &&,_V2_t &&)' being compiled
1> with
1> [
1> _Ret=LRESULT,
1> _Ty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>,
1> _Rx=LRESULT,
1> _V0_t=int,
1> _V1_t=WPARAM,
1> _V2_t=LPARAM
1> ]
1> D:\bin\Visual Studio\VC\include\functional(239) : see reference to function template instantiation '_Ret std::_Callable_obj<_Ty>::_ApplyX<_Rx,int,__w64 unsigned int,__w64 long>(_V0_t &&,_V1_t &&,_V2_t &&)' being compiled
1> with
1> [
1> _Ret=LRESULT,
1> _Ty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>,
1> _Rx=LRESULT,
1> _V0_t=int,
1> _V1_t=WPARAM,
1> _V2_t=LPARAM
1> ]
1> D:\bin\Visual Studio\VC\include\functional(239) : while compiling class template member function 'LRESULT std::_Func_impl<_Callable,_Alloc,_Rx,_V0_t,_V1_t,_V2_t>::_Do_call(_V0_t &&,_V1_t &&,_V2_t &&)'
1> with
1> [
1> _Callable=_MyWrapper,
1> _Alloc=std::allocator<std::_Func_class<LRESULT,int,WPARAM,LPARAM>>,
1> _Rx=LRESULT,
1> _V0_t=int,
1> _V1_t=WPARAM,
1> _V2_t=LPARAM
1> ]
1> D:\bin\Visual Studio\VC\include\functional(516) : see reference to class template instantiation 'std::_Func_impl<_Callable,_Alloc,_Rx,_V0_t,_V1_t,_V2_t>' being compiled
1> with
1> [
1> _Callable=_MyWrapper,
1> _Alloc=std::allocator<std::_Func_class<LRESULT,int,WPARAM,LPARAM>>,
1> _Rx=LRESULT,
1> _V0_t=int,
1> _V1_t=WPARAM,
1> _V2_t=LPARAM
1> ]
1> D:\bin\Visual Studio\VC\include\functional(516) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t,_V1_t,_V2_t>::_Do_alloc<_Myimpl,_Ty,_Alloc>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=LRESULT,
1> _V0_t=int,
1> _V1_t=WPARAM,
1> _V2_t=LPARAM,
1> _Ty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>,
1> _Alloc=std::allocator<std::_Func_class<LRESULT,int,WPARAM,LPARAM>>,
1> _Fty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> D:\bin\Visual Studio\VC\include\functional(516) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t,_V1_t,_V2_t>::_Do_alloc<_Myimpl,_Ty,_Alloc>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=LRESULT,
1> _V0_t=int,
1> _V1_t=WPARAM,
1> _V2_t=LPARAM,
1> _Ty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>,
1> _Alloc=std::allocator<std::_Func_class<LRESULT,int,WPARAM,LPARAM>>,
1> _Fty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> D:\bin\Visual Studio\VC\include\functional(516) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t,_V1_t,_V2_t>::_Reset_alloc<_Ty,std::allocator<std::_Func_class<_Ret,_V0_t,_V1_t,_V2_t>>>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=LRESULT,
1> _V0_t=int,
1> _V1_t=WPARAM,
1> _V2_t=LPARAM,
1> _Ty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>,
1> _Fty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>,
1> _Alloc=std::allocator<std::_Func_class<LRESULT,int,WPARAM,LPARAM>>
1> ]
1> D:\bin\Visual Studio\VC\include\functional(516) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t,_V1_t,_V2_t>::_Reset_alloc<_Ty,std::allocator<std::_Func_class<_Ret,_V0_t,_V1_t,_V2_t>>>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=LRESULT,
1> _V0_t=int,
1> _V1_t=WPARAM,
1> _V2_t=LPARAM,
1> _Ty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>,
1> _Fty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>,
1> _Alloc=std::allocator<std::_Func_class<LRESULT,int,WPARAM,LPARAM>>
1> ]
1> D:\bin\Visual Studio\VC\include\functional(692) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t,_V1_t,_V2_t>::_Reset<_Ty>(_Fty &&)' being compiled
1> with
1> [
1> _Ret=LRESULT,
1> _V0_t=int,
1> _V1_t=WPARAM,
1> _V2_t=LPARAM,
1> _Ty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>,
1> _Fty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> D:\bin\Visual Studio\VC\include\functional(692) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t,_V1_t,_V2_t>::_Reset<_Ty>(_Fty &&)' being compiled
1> with
1> [
1> _Ret=LRESULT,
1> _V0_t=int,
1> _V1_t=WPARAM,
1> _V2_t=LPARAM,
1> _Ty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>,
1> _Fty=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> main.cpp(27) : see reference to function template instantiation 'std::function<_Fty> &std::function<_Fty>::operator =<std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>>(_Fx &&)' being compiled
1> with
1> [
1> _Fty=LRESULT (int,WPARAM,LPARAM),
1> _Forced=false,
1> _Ret=void,
1> _Fun=LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),
1> _V0_t=EventListener *const ,
1> _V1_t=std::_Ph<1> &,
1> _V2_t=std::_Ph<2> &,
1> _V3_t=std::_Ph<3> &,
1> _V4_t=std::_Nil,
1> _V5_t=std::_Nil,
1> <unnamed-symbol>=std::_Nil,
1> _Fx=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>
1> ]
1> main.cpp(27) : see reference to function template instantiation 'std::function<_Fty> &std::function<_Fty>::operator =<std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>>(_Fx &&)' being compiled
1> with
1> [
1> _Fty=LRESULT (int,WPARAM,LPARAM),
1> _Forced=false,
1> _Ret=void,
1> _Fun=LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),
1> _V0_t=EventListener *const ,
1> _V1_t=std::_Ph<1> &,
1> _V2_t=std::_Ph<2> &,
1> _V3_t=std::_Ph<3> &,
1> _V4_t=std::_Nil,
1> _V5_t=std::_Nil,
1> <unnamed-symbol>=std::_Nil,
1> _Fx=std::_Bind<false,void,LRESULT (__stdcall EventListener::* )(int,WPARAM,LPARAM),EventListener *const ,std::_Ph<1> &,std::_Ph<2> &,std::_Ph<3> &,std::_Nil,std::_Nil,std::_Nil>
1> ]

最佳答案

在当前的 VS 2012 中,它不可能而且无论如何也不适用作为此问题的解决方案。这个想法是绑定(bind)成员函数并将其用作 Hook 过程。这是不可能的,正如 David Rodriguez 和 R. Martinho Fernandes(在聊天中 - lounge-C++)提到的那样,因为 std::bind 生成对象,而不是函数,因此它的结果不能作为参数传递给 SetWindowsHookEx。

关于c++ - 将 std::bind 与 __stdcall 函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13289548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com