الوصول إلى البيانات العالمية في DLL من وظيفة DLL تصدير

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

  •  20-09-2019
  •  | 
  •  

سؤال

أنا أقوم بإنشاء C ++ Win32 DLL مع بعض البيانات العالمية. هناك خريطة STD :: محددة عالميا وهناك وظائف تصديرها في DLL كتابة البيانات في الخريطة (بعد الحصول على قفل الكتابة، فكورسي).

مشكلتي هي، عندما أسمي وظيفة الكتابة من داخل DLL Dllmain، فإنها تعمل دون أي مشاكل. ولكن عندما أقوم بتحميل DLL من برنامج آخر واستدعاء الوظيفة التي تكتب البيانات في الخريطة العالمية، فإنها تعطيني هذا الخطأ:

WindowsError: exception: access violation reading 0x00000008

هل هناك شيء يمكن القيام به حيال ذلك؟ تتمتع الدالة نفسها عند الاتصال من Dllmain الوصول إلى البيانات العالمية في DLL، ولكن عند الاتصال من عملية مختلفة، لا يمكن الوصول إلى البيانات العالمية. من فضلك النصيحة.

أنا أستخدم مترجم TDM-MINGW GCC 4.4.0.

تعديل:حسنا، لقد اكتشفت ما هي المشكلة، وشكرا لشؤون المساعدة، لكن المشكلة لم تكن مع إصدار منشئ أو عدم القدرة على الحصول على خرائط في الفضاء العالمي، ولكن قضية في دفعة :: بيثون أنني استخدام. لقد اختبرتها، ولكن منذ أن كنت أسمي DLL من داخل Python أو ربما شيء ما، لم يتم تحميل وحدة URLLIB2 في DLL. الآن يجب أن أرى كيفية إصلاحه.

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

المحلول

يشبه منشئ std::map لم يركض بعد عند استدعاء الكود الخاص بك. مدى الحياة من غير القرون العالمي في Win32 DLL صعبة للغاية، وأنا لست متأكدا من كيفية تعامل Mingw على وجه التحديد. ولكن قد تكون الطريقة التي تتجمع فيها DLL، لقد قمت بتعيين وظيفتك الخاصة (DllMain؟) كأداة دخول، وبالتالي تجاوز روتين تهيئة CRT التي تستدعي المنشئين.

نصائح أخرى

يعني خطأ قراءة في مثل هذا عنوان الذاكرة المنخفض بشكل عام أنك تحاول الوصول إلى مؤشر فارغ في مكان ما. هل تستطيع إظهار الكود الفعلي الخاص بك؟

يجب عليك استخدام الذاكرة المشتركة، لأن العمليات المختلفة لها مسافات عنوان منفصلة. أعتقد أنك لن تحصل على STD :: خريطة تشغيل. أود أن أوصي باستخدام MapViewOffile، CreateFilemaping، OpenFilemaping، ... البيانات القديمة العادية. اسأل Google / MSDN.

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