ويندوز فيستا:غير قادر على تحميل DLL 'x.dll':وصول صالح إلى موقع الذاكرة.(DllNotFoundException)

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

سؤال

كنت أجري اختبارًا على جهاز أحد العملاء بعد ظهر هذا اليوم والذي يعمل بنظام التشغيل Windows Vista (كان لديه منزل، لكنني أجري اختبارًا على إصدار Business Edition بنفس النتائج).

نحن نستفيد من ملف .DLL الذي يحصل على معرف الجهاز الخاص بالكمبيوتر.استخدامه بسيط جدًا ويعمل نموذج البرنامج الذي قمت بإنشائه.دلل هو هذا من AzSdk.في الواقع، هذا يعمل بشكل مثالي تحت نظام التشغيل Windows XP.ومع ذلك، لسبب غريب، داخل مشروعنا (أكبر بكثير)، حصلنا على هذا الاستثناء:

Exception Type:        System.DllNotFoundException
Exception Message:     Unable to load DLL 'HardwareID.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)
Exception Target Site: GetHardwareID

لا أعرف ما الذي يمكن أن يسبب المشكلة، حيث أن لدي السيطرة الكاملة على المجلد.المشروع عبارة عن تطبيق C#.net Windows Forms وكل شيء يعمل بشكل جيد، باستثناء استدعاء المكتبة الخارجية.

وأنا أعلن ذلك كالتالي:(ملحوظة:إنه لا مكتبة COM ولا تحتاج إلى التسجيل).

[DllImport("HardwareID.dll")]
public static extern String GetHardwareID(bool HDD,
   bool NIC, bool CPU, bool BIOS, string sRegistrationCode);

ومن ثم فإن رمز الاتصال بسيط جدًا:

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = GetHardwareID(cb_HDD.Checked, 
                                  cb_NIC.Checked, 
                                  cb_CPU.Checked, 
                                  cb_BIOS.Checked, 
                                 "*Registration Code*");
}

عندما تقوم بإنشاء تطبيق نموذجي، فإنه يعمل، ولكن داخل مشروعي لا يعمل.تحت XP يعمل بشكل جيد.هل لديك أي أفكار حول ما يجب أن أفعله في نظام التشغيل Vista لإنجاح هذا العمل؟كما قلت، يتمتع المجلد والمجلدات الفرعية التابعة له بالتحكم الكامل في "الجميع".

تحديث: ليس لدي نظام Vista SP 1 مثبت.

التحديث 2: لقد قمت بتثبيت Vista SP1 والآن، مع تعطيل UAC، لا تعمل حتى العينة البسيطة!!!:( اللعنة فيستا.

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

المحلول

@مارتن

السبب وراء عدم حصولك على مطالبة UAC هو أن UAC يمكنها فقط تغيير كيفية العملية بدأت, ، بمجرد تشغيل العملية، يجب أن تظل على نفس مستوى الارتفاع.ستحدث مطالبة UAC إذا:

  • يعتقد نظام التشغيل Vista أنه برنامج تثبيت (الكثير من القواعد هنا, ، أبسطها هو إذا كان يسمى "setup.exe")،
  • إذا تم وضع علامة "تشغيل كمسؤول" عليه (يمكنك تحرير ذلك عن طريق تغيير خصائص الاختصار أو ملف exe)، أو
  • إذا كان ملف exe يحتوي على بيان يطلب امتيازات المسؤول.

الخياران الأولان عبارة عن حلول بديلة للتطبيقات "القديمة" التي كانت موجودة قبل UAC، والطريقة الصحيحة للقيام بذلك للتطبيقات الجديدة هي تضمين مورد واضح تطلب الامتيازات التي تحتاجها.

بعض البرامج مثل عملية المستكشف يبدو أنهم يرفعون عملية قيد التشغيل (عندما تختار "إظهار تفاصيل كل العمليات" في قائمة الملفات في هذه الحالة) ولكن ما يفعلونه حقًا هو بدء مثيل جديد، وهذا المثيل الجديد هو الذي يتم رفعه - وليس المثيل الذي كان تشغيل أصلا.هذه هي الطريقة الموصى بها للقيام بذلك إذا كانت بعض أجزاء تطبيقك فقط بحاجة إلى الرفع (على سبيل المثال.مربع حوار خاص بـ "خيارات المسؤول").

نصائح أخرى

غير قادر على تحميل DLL 'HardwareID.dll':وصول صالح إلى موقع الذاكرة.(استثناء من HRESULT:0x800703E6)

اسم DllNotFoundException يربكك - هذه ليست مشكلة في العثور على ملف DLL أو تحميله، المشكلة هي أنه عندما يتم تحميل DLL، فإنه يقوم بالوصول غير القانوني إلى الذاكرة مما يؤدي إلى فشل عملية التحميل.

مثل ملصق آخر هنا، أعتقد أن هذه مشكلة DEP، وأن تغييرات UAC وما إلى ذلك قد سمحت لك أخيرًا بتعطيل DEP لهذا التطبيق.

هل الجهاز الذي لديك الكود منتشر على جهاز 64 بت؟من الممكن أيضًا أن تصادف أ قسم مشكلة.

يحرر

هذا هو جهاز Macbook Pro من الجيل الأول مزود بمعالج Core Duo 2 Intel من الجيل الأول.بعيدًا عن 64 بت.

لقد ذكرت 64 بت، لأنه في المستويات المنخفضة لا يتم التعامل مع الهياكل من 32 بت إلى 64 بت بشكل صحيح.نظرًا لأن الأجهزة ليست 64 بت، فمن المرجح أن يكون تعطيل DEP خطوة منطقية تالية جيدة.لقد أصبح نظام Vista أكثر أمانًا من XP SP2.

حسنًا، لقد قمت للتو بإيقاف تشغيل DEP عالميًا دون جدوى.نفس الخطأ.

حسنًا، قرأت أيضًا أن الأشخاص كانوا يتلقون هذا الخطأ بعد تحديث الجهاز إلى نظام التشغيل Vista SP1.هل تحتوي عمليات تثبيت نظام التشغيل Vista هذه على SP1؟

اتضح أنه شيء مختلف تمامًا.فقط من أجل الاختبار، لقد قمت بتعطيل UAC (ملاحظة:لم أتلق أي مطالبة).

عظيم، كنت سأقترح ذلك بالفعل، لكنني اعتقدت أنك ربما جربته بالفعل.

هل قدمت طلب دعم إلى البائع؟ربما يكون هناك شيء ما في أجهزة MacBook Pro يمنع المنتج من العمل.

نظرًا لأن الاستثناء هو DllNotFoundException، فقد ترغب في محاولة التحقق من HardwareID.dll باستخدامه ووكر التبعية قبل تثبيت أي أدوات تطوير على نظام التشغيل Vista، قم بالتثبيت لمعرفة ما إذا كانت هناك بالفعل تبعية مفقودة.

بالإضافة إلى السماح بالتحكم الكامل لـ "الجميع"، هل يسمح الموقع أيضًا بكتابة العمليات ذات مستوى التكامل المتوسط؟

كيف يمكنني التحقق من ذلك؟أنا جديد على نظام التشغيل Vista، ولا يعجبني كثيرًا، فهو بطيء جدًا داخل جهاز افتراضي للعمل اليومي، وبالنسبة لاستخدام VStudio داخل جهاز افتراضي، فهو لا يأتي بأي شيء جديد.

من موجه الأوامر يمكنك تنفيذ:

icacls C:\Folder

إذا رأيت سطرًا مثل "التسمية الإلزامية\المستوى الإلزامي العالي"، فلا يمكن الوصول إلى المجلد إلا من خلال عملية ذات تكامل عالي.إذا لم يكن هناك مثل هذا الخط، فيمكن لعمليات التكامل المتوسطة الوصول إليه بشرط عدم وجود قوائم ACL أخرى ترفض الوصول (استنادًا إلى المستخدم على سبيل المثال).

يحرر:نسيت أن أذكر أنه يمكنك استخدام مفتاح /setintegritylevel لتغيير مستوى التكامل المطلوب للوصول إلى الكائن.

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