__stdcall with boost::function
I'm trying to pass a member function pointer around to the Windows Service Control Manager through
Windpws API functions, but I think I'm having troubles with the __stdcall convention.
I'm using MSVC 7.1.3088. For brevity I've left out information, but I think this is enough to go on:
__ExampleClass.h__
class ExampleClass
{
protected:
void Setup( void );
void __stdcall ServiceMain( DWORD dwArgc, LPSTR *lpszArgv );
LPSERVICE_MAIN_FUNCTION m_fServiceMain;
};
__ExampleClass.cpp__
void ExampleClass::Setup( void )
{
boost::function
Olenhouse, Jason wrote:
I'm trying to pass a member function pointer around to the Windows Service Control Manager through Windpws API functions, but I think I'm having troubles with the __stdcall convention. <snip>
No, the problem is passing a member function pointer. A member function pointer is not type-compatible with a function pointer with the same parameter types, regardless of whether they have the same calling convention. ServiceMain has to be a static member or free function. If you really need to pass your own argument(s) to it then use a static variable or TLS slot. Ben.
On Mar 10, 2005, at 12:16 PM, Olenhouse, Jason wrote:
I'm trying to pass a member function pointer around to the Windows Service Control Manager through Windpws API functions, but I think I'm having troubles with the __stdcall convention.
I'm using MSVC 7.1.3088. For brevity I've left out information, but I think this is enough to go on:
__ExampleClass.h__ class ExampleClass { protected: void Setup( void ); void __stdcall ServiceMain( DWORD dwArgc, LPSTR *lpszArgv ); LPSERVICE_MAIN_FUNCTION m_fServiceMain; };
__ExampleClass.cpp__ void ExampleClass::Setup( void ) { boost::function
f2 = boost::bind( boost::mem_fn( &ExampleClass::ServiceMain ), this, _1, _2 ); m_fServiceMain = f2.target ( );
There seem to be two issues here. The first issue is that function::target() does something different than what you're trying to do. function::target<T>() will return a pointer to a T. If the actual object stored by the instance of boost::function has type T, you get the pointer; otherwise, you get a NULL pointer. If the code above had worked, m_fServiceMain would get a NULL pointer, because the type of the bind expression in the line before it is something big, ugly, and very hard to reproduce (but it can't be void(DWORD, LPSTR*)). The second issue is that void(DWORD, LPSTR*) is probably not the type you want, because it is not the type of a function object. To extract a function pointer, you would use, e.g., "void (*)(DWORD, LPSTR*) ". I'm sure the __stdcall needs to be in that type somewhere, but I don't know where it would go :( Doug
participants (3)
-
Ben Hutchings
-
Douglas Gregor
-
Olenhouse, Jason