[C++] בעיה ב-SetTimer - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

[C++] בעיה ב-SetTimer


tdknight

Recommended Posts

אני משתמש בפונקציה SETTIMER באופן הבא:


TimerId=SetTimer((UINT)23,(UINT)MySurface->GetTimeUnit(),NextTimeUnit);

כאשר הפונקציה NextTimeUnit מוצהרת כך:


void CALLBACK NextTimeUnit(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime);

ע"פ כל מקור אינטרנטי שראיתי על הפונקציה, זה אמור לעבוד.

אבל המהדר מוציא לי שגיאה כזאת:

'SetTimer' : cannot convert parameter 3 from 'void (struct HWND__ *,unsigned int,unsigned long,unsigned long)' to 'void (__stdcall *)(struct HWND__ *,unsigned
int,unsigned int,unsigned long)'

(מציג את הפקודה הראשונה שהבאתי)

מה הבעיה, איך פותרים אותה?

נ.ב. אני משתמש בVisual C++ 6

קישור לתוכן
שתף באתרים אחרים

נראה לי שהבנתי מה הבעיה...

במערכות של 32 ביט, UINT_PTR מוגדר להיות unsigned int. במערכות של 64 ביט, UINT_PTR הוא unsigned long.

משום מה, זה גורם בעיה.

נסה להחליף את הטיפוס של idEvent ל-UINT.

קישור לתוכן
שתף באתרים אחרים

אובייקט ? האם NextTimeUnit מוגדרת כפונקציה סטטית ?

לא... זה משנה? חוץ מזה הפונקציה פונה לפרמטרים לא סטטיים של המחלקה, אז איך אוכל להגדיר אותה כסטטית?

שניצל ניסיתי את זה כבר, הוא עדיין מוציא אותה שגיאה, אפילו שכל הפרמטרים מאותו טיפוס:


'SetTimer' : cannot convert parameter 3 from 'void (struct HWND__ *,unsigned int,unsigned int,unsigned long)' to 'void (__stdcall *)(struct HWND__ *,unsigned
int,unsigned int,unsigned long)'

מה זה ה _stdcall * שהוא מוסיף שם(אני לא מבין בזה).

קישור לתוכן
שתף באתרים אחרים

כן, זה משנה. היא חייבת להיות מתודה סטטית או פונקציה חופשית. הסיבה היא שמתודות לא-סטטיות נקראות בייחס לאובייקט ספציפי, ולכן ה-calling convention שלהם שונה מפונקציה רגילה או פונקציה סטטית. אחד המימושים הסטנדרטיים לזה הוא שהקומפיילר מעביר את המצביע לאובייקט (this) בפרמטר הראשון.

אם אתה רוצה להגיע למשתני אובייקט, אתה צריך לדאוג של-callback יגיע משהו שאתה מספק מראש, לדוגמא מצביע לאובייקט.

דרך מקובלת אחת היא משהו כזה:


class X
{
public:
//...
void doCallback( int foo ); // Actual callback code, can use members, etc...
//...
};


void CallbackBridge ( int current_foo, void* ptr ) // A Bridge from a callback to the member funcion
{
X* the_object= (X*)ptr;
if ( the_object != NULL )
the_object->doCallback( current_foo );
}

int main ()
{
// ...
X the_object;
RegisterCallback( CallbackBridge, (void*)&the_object );
// ...
};

כמובן ה-framework שאתה משתמש בו (במקרה שלך SetTimer) צריך לאפשר לך להביא מידע לפונקצית ה-callback, וסביר שאכן הוא עושה זאת.

לפעמים לפני CallbackBridge תצטרך להוסיף:


extern "C" void CallbackBridge ( int current_foo, void* ptr ) // ...

קישור לתוכן
שתף באתרים אחרים

אז איך זה אמור להיראות... ככה?:

הצהרות:


static void CALLBACK NextTimeUnit(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime, void *ptr);
void NextTimeUnit();

אחר כך הרג'יסטר:


RegisterCallback(NextTimeUnit,(void*)this);

ואז פשוט קריאה לSETTIMER?

הוא מציג לי את השגיאה הבאה:


'RegisterCallback' : undeclared identifier

(כפי שציינתי קודם אני בVC++6)

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...