VC6.0 C++ Callback Function pointer

EagleKeeper

Discussion Club Moderator<br>Elite Member
Staff member
Oct 30, 2000
42,591
5
0
Situation:

Code in File #1 (Foo) has only access to Foo2 header file (#3)
Foo2 has no knowledge of Foo.

File #1 (Foo.h)

#include "Foo2.h"
class Foo
{
Foo()
int Foo_Callback() {}
};


File #2 (Foo.cpp)

Foo *pFoo;
Foo2 *pFoo2;
LRESULT CALLBACK Foo2_Callback()
{
pFoo->Foo_Callback();
}

Foo::Foo()
{
pFoo = this;
pFoo2->CreateCallbackThread(Foo2_Callback);
}



File #3 (Foo2.h)
class Foo2
{
Foo2()
void CreateCallbackThread(LPVOID pCallbackRoutine);
};



File #4 (Foo2.cpp)
#include "Foo2.h"
static UINT Callback( LPVOID pCallbackRoutine )
{
// single pass after the thread is release
AfxGetThread()->SetThreadPriority(THREAD_PRIORITY_NORMAL);
while (true)
{
AfxGetThread()->SuspendThread();
pCallbackRoutine;
// (*pCallbackRoutine)(); // Compiler is not happy
}
}

Foo2::Foo2() {}

void Foo2::CreateCallbackThread(LPVOID pCallbackRoutine)
{
HANDLE hCallbackThread = AfxBeginThread (Callback, // static thread function
pCallbackRoutine, // parameter from Foo
THREAD_PRIORITY_ABOVE_NORMAL);
}

=======================================================

VC++6.0 Compiler will handle this code.
When executed, Callback in Foo2 skips over pCallbackRoutine.

How do I setup the pCallbackRoutine pointer to be executed in Callback

I can set an array of pointers to the function and index into the array.
The problem seems to be that pCallbackRoutine needs to be properly declared/executed as a function in Callback

 

smack Down

Diamond Member
Sep 10, 2005
4,507
0
0
No idea the solution but is this line correct
Foo2::CreateCallbackThread(Callback);

Shouldn't Callback be Foo_CallBack?
 

DaveSimmons

Elite Member
Aug 12, 2001
40,730
670
126
If I'm reading this right:

The problem is the compiler only knows pCallbackRoutine is a void* so it doesn't know how to set up the stack frame for the function.

Does it only need to support a single callback signature of a pointer to void func() ?

If so, can't you cast the void* into a function pointer before calling it?

Something like:

typedef void (*voidfunction) (void);

....

((voidfunction) pCallbackRoutine)();
 

Cooler

Diamond Member
Mar 31, 2005
3,835
0
0
Here how I would do it without any of the Microsoft libraries .

#include <cstdlib>
#include <vector>
#include <iostream>

typedef void (*voidfunction)(void);

using namespace std;
class Callback
{
private :
vector< voidfunction> list;

public :
void regesterMethod(voidfunction toadd)
{
list.push_back(toadd);
}
void callAllMethods()
{
for ( int i = 0; i < list.size(); i++)
list();
}
};
void Test1()
{
cout<<"Test1 CallBack \n";
}
void Test2()
{
cout<<"Test2 CallBack \n";
}
int main(int argc, char *argv[])
{
Callback Tester;
Tester.regesterMethod(&Test1);
Tester.regesterMethod(&Test2);
Tester.callAllMethods();
system("PAUSE");
return 0;
}
 

HigherGround

Golden Member
Jan 9, 2000
1,827
0
0
always typedef your function pointers, even if it's only for the readers' sake

typedef LRESULT (*FooCallback)(void);

now you can cast argument into a type, which in this case is a function pointer and just call it

FooCallback callback = (FooCallback)pCallbackRoutine;
callback();

 

EagleKeeper

Discussion Club Moderator<br>Elite Member
Staff member
Oct 30, 2000
42,591
5
0
Problem has been solved using DaveSimmons and HigherGround suggestions.
Added lines are bolded. Both suggested the same thing.

Thanks guys



static UINT Callback( LPVOID pCallbackRoutine )
{
typedef void (*CallbackFunction) (void);
// single pass after the thread is release
AfxGetThread()->SetThreadPriority(THREAD_PRIORITY_NORMAL);
while (true)
{
AfxGetThread()->SuspendThread();
((CallbackFunction) pCallbackRoutine)();
}
}
 

EagleKeeper

Discussion Club Moderator<br>Elite Member
Staff member
Oct 30, 2000
42,591
5
0
Originally posted by: smack Down
No idea the solution but is this line correct
Foo2::CreateCallbackThread(Callback);

Shouldn't Callback be Foo_CallBack?

Corrected that oversight

 
sale-70-410-exam    | Exam-200-125-pdf    | we-sale-70-410-exam    | hot-sale-70-410-exam    | Latest-exam-700-603-Dumps    | Dumps-98-363-exams-date    | Certs-200-125-date    | Dumps-300-075-exams-date    | hot-sale-book-C8010-726-book    | Hot-Sale-200-310-Exam    | Exam-Description-200-310-dumps?    | hot-sale-book-200-125-book    | Latest-Updated-300-209-Exam    | Dumps-210-260-exams-date    | Download-200-125-Exam-PDF    | Exam-Description-300-101-dumps    | Certs-300-101-date    | Hot-Sale-300-075-Exam    | Latest-exam-200-125-Dumps    | Exam-Description-200-125-dumps    | Latest-Updated-300-075-Exam    | hot-sale-book-210-260-book    | Dumps-200-901-exams-date    | Certs-200-901-date    | Latest-exam-1Z0-062-Dumps    | Hot-Sale-1Z0-062-Exam    | Certs-CSSLP-date    | 100%-Pass-70-383-Exams    | Latest-JN0-360-real-exam-questions    | 100%-Pass-4A0-100-Real-Exam-Questions    | Dumps-300-135-exams-date    | Passed-200-105-Tech-Exams    | Latest-Updated-200-310-Exam    | Download-300-070-Exam-PDF    | Hot-Sale-JN0-360-Exam    | 100%-Pass-JN0-360-Exams    | 100%-Pass-JN0-360-Real-Exam-Questions    | Dumps-JN0-360-exams-date    | Exam-Description-1Z0-876-dumps    | Latest-exam-1Z0-876-Dumps    | Dumps-HPE0-Y53-exams-date    | 2017-Latest-HPE0-Y53-Exam    | 100%-Pass-HPE0-Y53-Real-Exam-Questions    | Pass-4A0-100-Exam    | Latest-4A0-100-Questions    | Dumps-98-365-exams-date    | 2017-Latest-98-365-Exam    | 100%-Pass-VCS-254-Exams    | 2017-Latest-VCS-273-Exam    | Dumps-200-355-exams-date    | 2017-Latest-300-320-Exam    | Pass-300-101-Exam    | 100%-Pass-300-115-Exams    |
http://www.portvapes.co.uk/    | http://www.portvapes.co.uk/    |