   
Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008
Репутация: 15 Всего: 26
|
угу, (boost|tr1)::function не поддерживает stdcall, использовать bind который поддерживает stdcall - это малость оверхед, да и сам function - немалый оверхед (~32байта на указатель) а свои классы выглядят страшно %) Код | #ifndef API_FUNCTION_H_INCLUDED_ #define API_FUNCTION_H_INCLUDED_
/* Windows API Dynamic Import * * Example:
api_function<void()> foo("some.dll", "foo"); .... foo();
* */
#include <windows.h>
namespace detail {
template<typename Signature> struct stdcall_function_ptr;
struct stdcall_function_address { typedef void* ptr_t; ptr_t ptr; };
/* ================= stdcall_function_ptr code was generated by following Python script: =============
def num_list(pfx, n): return ', '.join(pfx + str(i) for i in range(n)) def num_pairs(pfx1, pfx2, n): return ', '.join(pfx1 + str(i) + ' ' + pfx2 + str(i) for i in range(n)) for i in range(16): print(""" template<typename R, """ + num_list('typename T', i) + """> struct stdcall_function_ptr<R(""" + num_list('T', i) + """)> : stdcall_function_address { typedef R(__stdcall *fn_t)(""" + num_list('T', i) + """); R operator() (""" + num_pairs('T', 'a', i) + """) { return (*(fn_t)ptr)(""" + num_list('a', i) + """); } };""")
*/
template<typename R, > struct stdcall_function_ptr<R()> : stdcall_function_address { typedef R(__stdcall *fn_t)(); R operator() () { return (*(fn_t)ptr)(); } };
template<typename R, typename T0> struct stdcall_function_ptr<R(T0)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0); R operator() (T0 a0) { return (*(fn_t)ptr)(a0); } };
template<typename R, typename T0, typename T1> struct stdcall_function_ptr<R(T0, T1)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1); R operator() (T0 a0, T1 a1) { return (*(fn_t)ptr)(a0, a1); } };
template<typename R, typename T0, typename T1, typename T2> struct stdcall_function_ptr<R(T0, T1, T2)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2); R operator() (T0 a0, T1 a1, T2 a2) { return (*(fn_t)ptr)(a0, a1, a2); } };
template<typename R, typename T0, typename T1, typename T2, typename T3> struct stdcall_function_ptr<R(T0, T1, T2, T3)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3); R operator() (T0 a0, T1 a1, T2 a2, T3 a3) { return (*(fn_t)ptr)(a0, a1, a2, a3); } };
template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4> struct stdcall_function_ptr<R(T0, T1, T2, T3, T4)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3, T4); R operator() (T0 a0, T1 a1, T2 a2, T3 a3, T4 a4) { return (*(fn_t)ptr)(a0, a1, a2, a3, a4); } };
template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5> struct stdcall_function_ptr<R(T0, T1, T2, T3, T4, T5)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3, T4, T5); R operator() (T0 a0, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) { return (*(fn_t)ptr)(a0, a1, a2, a3, a4, a5); } };
template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> struct stdcall_function_ptr<R(T0, T1, T2, T3, T4, T5, T6)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3, T4, T5, T6); R operator() (T0 a0, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) { return (*(fn_t)ptr)(a0, a1, a2, a3, a4, a5, a6); } };
template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> struct stdcall_function_ptr<R(T0, T1, T2, T3, T4, T5, T6, T7)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3, T4, T5, T6, T7); R operator() (T0 a0, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7) { return (*(fn_t)ptr)(a0, a1, a2, a3, a4, a5, a6, a7); } };
template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> struct stdcall_function_ptr<R(T0, T1, T2, T3, T4, T5, T6, T7, T8)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3, T4, T5, T6, T7, T8); R operator() (T0 a0, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8) { return (*(fn_t)ptr)(a0, a1, a2, a3, a4, a5, a6, a7, a8); } };
template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> struct stdcall_function_ptr<R(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9); R operator() (T0 a0, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8, T9 a9) { return (*(fn_t)ptr)(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } };
template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> struct stdcall_function_ptr<R(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10); R operator() (T0 a0, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8, T9 a9, T10 a10) { return (*(fn_t)ptr)(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } };
template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11> struct stdcall_function_ptr<R(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11); R operator() (T0 a0, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8, T9 a9, T10 a10, T11 a11) { return (*(fn_t)ptr)(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } };
template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12> struct stdcall_function_ptr<R(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12); R operator() (T0 a0, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8, T9 a9, T10 a10, T11 a11, T12 a12) { return (*(fn_t)ptr)(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } };
template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13> struct stdcall_function_ptr<R(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13); R operator() (T0 a0, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8, T9 a9, T10 a10, T11 a11, T12 a12, T13 a13) { return (*(fn_t)ptr)(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } };
template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14> struct stdcall_function_ptr<R(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)> : stdcall_function_address { typedef R(__stdcall *fn_t)(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14); R operator() (T0 a0, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8, T9 a9, T10 a10, T11 a11, T12 a12, T13 a13, T14 a14) { return (*(fn_t)ptr)(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } };
} // namespace detail
template<typename Signature> struct api_function : detail::stdcall_function_ptr<Signature> { api_function(HMODULE hModule, const char* functionName) { ptr = (ptr_t)GetProcAddress(hModule, functionName); } api_function(const char* moduleName, const char* functionName) { ptr = (ptr_t)GetProcAddress(LoadLibraryA(moduleName), functionName); } };
#endif // API_FUNCTION_H_INCLUDED_
|
|