سؤال

في تطبيقات Windows التي أعمل عليها، لدينا إطار عمل مخصص يقع مباشرة فوق Win32 (لا تسأل).عندما نقوم بإنشاء نافذة، فإن ممارستنا المعتادة هي وضعها this في منطقة بيانات المستخدم بالنافذة عبر SetWindowLong(hwnd, GWL_USERDATA, this), ، والذي يسمح لنا بالحصول على رد اتصال يشبه MFC أو متكامل بإحكام WndProc, اعتمادا على.المشكلة هي أن هذا لن يعمل على نظام Win64، نظرًا لأن LONG يبلغ عرضه 32 بت فقط.ما هو الحل الأفضل لهذه المشكلة الذي يعمل على أنظمة 32 و 64 بت؟

هل كانت مفيدة؟

المحلول

SetWindowLongPtr تم إنشاؤه ليحل محل SetWindowLong في هذه الحالات.تسمح لك معلمة LONG_PTR بتخزين مؤشر لمجموعات 32 بت أو 64 بت.

LONG_PTR SetWindowLongPtr(      
    HWND hWnd,
    int nIndex,
    LONG_PTR dwNewLong
);

تذكر أن الثوابت تغيرت أيضًا، لذا يبدو الاستخدام الآن كما يلي:

SetWindowLongPtr(hWnd, GWLP_USERDATA, this);

ولا تنس أيضًا أنه الآن لاسترداد المؤشر، يجب عليك استخدامه GetWindowLongPtr:

LONG_PTR GetWindowLongPtr(      
    HWND hWnd,
    int nIndex
);

وسيبدو الاستخدام (مرة أخرى، مع الثوابت المتغيرة):

LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
MyObject* pMyObject = (MyObject*)lpUserData;

نصائح أخرى

البديل الآخر هو SetProp/RemoveProp (عندما تقوم بتصنيف نافذة تستخدم بالفعل GWLP_USERDATA)

بديل جيد آخر هو أسلوب ATL thunking لـ WNDPROC، لمزيد من المعلومات حول ذلك، راجع

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top