ما هي الطريقة الصحيحة المدلى بها من 'OLE_HANDLE' إلى 'HICON'?

StackOverflow https://stackoverflow.com/questions/401812

سؤال

ما هي الطريقة الصحيحة المدلى بها من 'OLE_HANDLE' إلى 'HICON أي x64 الهدف بناء ؟

ولا سيما مع العادية ج-أسلوب المدلى بها ، أحصل على هذا التحذير عند ترجمة مع x64 التكوين:

تحذير C4312:'نوع الزهر' :التحويل من OLE_HANDLE' إلى 'HICON' أكبر حجم

هنا هو المخالف كود:

imgList.Add((HICON)ohIcon);

رمز أعلاه يعمل بشكل جيد بالنسبة لي ولكن أريد أن أتخلص من التحذير عند بناء إلى x64.

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

المحلول

H يعطي بعيدا ، في هذه الحالة المكتبة البرمجية خلقت نوع متميز أن تعطيك قليلا من نوع السلامة (في الأيام القديمة ج واجهات برمجة التطبيقات).

هم في الواقع كل من يتعامل ، الذي هو نواة الكائن الذي لا يهتم حقا ما الموارد هو فقط أن يكون لديك 'التعامل مع الأمر.تذكر API C واحدة ، وذلك باستخدام C أسلوب يلقي ، وعندما تأتي إلى حذفه ، استخدام DeleteObject().

تحرير:64 بت إيه...المشكلة بسبب MS تحديث مقابض أن يكون 64 بت ، لكنه ترك أوله الأشياء وحده.لحسن الحظ, كل ما فعلوه كان وسادة إضافية بت مع أصفار.

حاول استخدام LongToHandle إجراءات التحويل ونرى لاستدعاء برنامج التحويل البرمجي midl ترقية دليل - انتقل في منتصف الطريق إلى أسفل إلى "المستخدم" و "GDI مقابض التوقيع على تمديد 32b القيم" المقطع.

نصائح أخرى

على افتراض كنت تستخدم Microsoft Visual Studio بناء على السؤال...

إذا كنت تقوم بتطوير فقط 32 بت الأهداف ، يمكنك اختيار تعطيل هذه (وغيرها من تحذيرات مماثلة) عن طريق إيقاف المشروع الخيار "كشف 64 بت قابلية المسائل" (C++ الخيار برنامج التحويل البرمجي /Wp64).

إذا كنت تقوم بتطوير 64 بت الأهداف كذلك ، ثم @هاربر ربما هو على حق و سوف تحتاج إلى القيام ببعض التحريات عن الطريقة الصحيحة للتعامل مع هذا.قد ترغب في قراءة هذه الورقة البيضاء كنقطة;انتقل إلى القسم عن المستخدم و GDI مقابض.

لقد بحثت قليلا - OLE_HANDLE يبدو غير موقعة طويلة ، HICON هو الفراغ* .في 32 بت ويندوز, هذه هي نفس الحجم ، ولكن في ويندوز x64 الفراغ* هو 64 بت.ليس هناك طريقة آمنة لجعل هذا الزهر اضافية 32 بت غير معروف.للأسف النصيحة الوحيدة التي تمكنت من حفر تنطوي ULONGs (OLE_HANDLEs هي أكثر ندرة البهائم) قال ببساطة "لا الزهر هذا المؤشر".

وأظن أن "الصحيح" الجواب "الصحيح" طريقة يلقي بينهما هو "لا تفعل ذلك".من المسلم به أنه ليس من المفيد جدا ...أين هو OLE_HANDLE قادمة من في المقام الأول ؟ يبدو أنك ذاهب إلى كتابة التعليمات البرمجية باستخدام OLE_HANDLE استخدام HICON في كل مكان.

HICON hSomeIcon = (HICON) hSomeOLEHandle;

أيإنهم قابلة للتبديل.

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