سؤال

أواجه مشكلة في محتويات المؤشر المرت لأن WPARAM من تطبيق C # 32 بت يتغير على طول الطريق إلى عملية C ++ 64 بت.

هناك عمليان 32.exe (في C #) و 64.exe (في C ++). يتم تشغيل 64.exe كعملية لطفل من 32.exe. 32.EXE Post Window Message for 64.exe، واحد منها لديه WPARAM وهو مؤشر إلى مجموعة من هياكل اليقص. تحتوي كل من 64.exe و 32.exe على DLL مشترك (مكتوب في C ++، ولكن تم تجميعها لمنصات مختلفة، بالطبع)، تسمى 32.dll و 64.dll.

وظيفة تتوقع مستقلة * في 32.dll يسمى مباشرة من 32.exe مع نفس المسافة * التي يتم نشرها لاحقا، وهذا يعمل بشكل جيد. بعد ذلك نشر رسالة إلى 64.exe، والتي تستدعي نفس الوظيفة وتسمى WPPARAM TIT *:

else if (WM_SetDisabledAreas == message)
{
    SetDisabledAreas((RECT*)wParam, (UINT)lParam);
}

يتم نشر الرسالة على النحو التالي:

    if (Is64Bit() && SubProcess64 != null)
    {
        Win32.PostMessage(SubProcess64.MainWindowHandle, WindowMessages.SetDisabledAreas,
            (uint)pointer.ToInt32(), length);
    }
    MessageBox.Show(pointer.ToString());
    DLL32.SetDisabledAreas(pointer, length);

عن طريق تصحيح الأخطاء لقد تم التحقق من صحة الرسالة، ولكن عنوان WPARAM ليس هو نفسه كما كان من قبل. هذا ليس غير متوقع، ولكن محتويات الذاكرة يشير الآن إلى غير محدد (وأحصل على انتهاك وصول عند محاولة معرفة ما هو هناك).

ماذا يحصل هنا؟

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

المحلول

يحتوي كل من العملياتتين على مساحة عنوان خاصة، بحيث يكون المؤشر من العملية 32.exe غير صالح في 64.exe.

ومع ذلك، هذا لا علاقة له ب 32 بت vs 64bit على الإطلاق. عليك فقط استخدام تقنية اتصال Interprocess من اختيارك لنقل البيانات بين العمليين.

على سبيل المثال، يمكنك استخدام createfilemaping. لإنشاء قسم مسمى من الذاكرة المشتركة.

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