لا P/الاحتجاج على ويندوز 64-بت يتطلب توقيعات مختلفة من 32 بت ؟

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

  •  07-07-2019
  •  | 
  •  

سؤال

عند إنشاء توقيع يشير إلى user32.dll على سبيل المثال يجب أن يكون بناء هذا مع user64.dll إذا كان الهدف هو 64 بت الكمبيوتر ؟

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool ChangeClipboardChain(
    IntPtr hWndRemove,
    IntPtr hWndNewNext);

حاليا هذا ليس مشكلة كما أنا استهداف 32 بت فقط بسبب مكتبة من بائع (التقدم OpenEdge) التي توفر فقط 32 بت المكتبات للوصول إلى قاعدة البيانات الخاصة بهم.

ليس لدي حاليا ويندوز 64-بت الكمبيوتر لمعرفة ما إذا كان هذا هو الحال.

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

المحلول

وعلى الرغم من اصطلاح التسمية، user32.dll (وغيرها 32 ... دلس) هي في الواقع 64 بت على 64 بت الآلات. هذه هي الأسماء التاريخية لدلس، وظلت على هذا النحو بغض النظر عن التغيرات في التصميم الأساسي. هل لديك للقراءة من هذا الصفحة للحصول على مزيد من التفاصيل.

نصائح أخرى

يجب أن لا تحتاج إلى تغيير التوقيع/اسم ملف DLL الذي قمت رابط عند استدعاء USER32.DLL المهام.

على الرغم من تسمية الاتفاقية على ويندوز 64-بت آلة ، USER32.DLL الملف الذي يجلس في [Windows]\System32 هو في الواقع 64 بت DLL.على الحقيقي الإصدار 32 بت من USER32.DLL في الواقع يجلس في مجلد يسمى [Windows]\SysWow64.

يرجى الاطلاع هذا السؤال للحصول على مزيد من المعلومات.

الشيء الوحيد الذي عليك ربما تحتاج إلى أن تكون أكثر حذرا من هي أنواع البيانات التي تمر في كمعلمات إلى مختلف وظائف API Windows.على سبيل المثال ، "SendMessage" وظيفة داخل USER32.DLL لديها متطلبات محددة مع واحد على الأقل من المعلمات (وفقا صفحة على P/الاحتجاج).

هذا هو التوقيع:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

وتلاحظ 2 & 3 أدناه بوضوح:

2) ابدأ استخدام "الباحث" أو "صحيح" كما lParam.التعليمات البرمجية الخاصة بك سوف تحطم على 64 بت يقوم نظام ويندوز.فقط استخدام IntPtr, و "المرجع" هيكل أو "خارج" هيكل.

3) لا تستخدم أبدا "منطقي", "الباحث" ، أو "صحيح" كما قيمة الإرجاع.الخاص بك الأساسية سوف تحطم على ويندوز 64-بت.فقط استخدام IntPtr.ليس من الآمن استخدام منطقي - pInvoke لا يمكن أن المشير an IntPtr إلى منطقية.

هذا "التحذير" يبدو أن تكون محددة لهذا وظيفة معينة (SendMessage) ، على الرغم من أنه شيء أود أن تولي اهتماما خاصا عند الاتصال إلى أي وظائف API Windows.

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