استرجاع COM فئة مصنع مكون مع CLSID {XXXX} فشل بسبب الخطأ التالي:80040154

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

سؤال

لقد وضعت خدمة Windows باستخدام C#.NET توليد تقرير PDF.لإنشاء ملف PDF أنا باستخدام طرف ثالث dll.يتم تشغيل التطبيق في نظام التشغيل Windows XP منصة.عندما نشر الخدمة في نظام التشغيل Windows Server 2008 64 بت, حصلت على هذا الخطأ:

استرجاع COM فئة مصنع عنصر مع CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} فشل بسبب الخطأ التالي:80040154.

لقد سجلت DLL باستخدام الأمر regsvr32.كنت قادرا على رؤية هذا CLSID في التسجيل.ولكن استمرت المشكلة.

ماذا يمكن أن تكون المشكلة ؟

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

المحلول

في VS - خصائص المشروع - في علامة التبويب إنشاء - منصة الهدف = X86

نصائح أخرى

وهذا يبدو وكأنه شيد خدمتكم ضد "أي وحدة المعالجة المركزية"، تسبب لك أخطاء على 64 بت حيث كنت تستخدم مكونات COM. انت بحاجة الى بناء عليه لx86.

وهذا الموقع هو على الارجح تشغيل كعملية 32 بت الذي هو السبب في أنه يمكن استخدام المكون. وبناء الحل الخاص بك ضد x86 فرض الخدمة الخاص بك لتشغيل 32 بت.

وأنا واجهت مشكلة مشابهة جدا.

وكنت بحاجة لاستخدام DLL 32 بت القديم في تطبيق ويب التي يجري وضعها على جهاز 64 بت. لقد سجلت في DLL 32 بت في ويندوز مجلد sysWOW64 \ باستخدام إصدار regsrv32 في هذا المجلد.

ويدعو لطرف ثالث يعمل DLL من وحدة الاختبارات في Visual Studio لكنه فشل من تطبيق ويب استضافتها في IIS على نفس الجهاز مع الخطأ 80040154.

وتغيير تجمع التطبيقات "تمكين تطبيقات 32 بت" حل المشكلة.

لا يمكنك تكوين خصائص المشروع منصة الهدف X86.يمكنك أيضا تكوين iis خيارات للعمل مع x86 مثل هذا

  • حدد تجمع التطبيقات
  • حدد مجمع التطبيق الخاص بك يستخدم
  • إعدادات متقدمة
  • تمكين تطبيقات 32 بت صحيح

إذا كنت تبحث عن وسيلة لجعل هذا العمل دون ترجمة أي وحدة المعالجة المركزية التطبيق هنا هو محتمل آخر الحل:

  1. تحديد موقع كائن COM GUID تحت HKey_Classes_Root\Wow6432Node\CLSID\{GUID}
  2. يقع مرة واحدة إضافة جديدة REG_SZ (سلسلة) القيمة.يجب أن يكون اسم معرف التطبيق و يجب أن تكون البيانات نفس COM كائن GUID لديك فقط بحثت عن
  3. إضافة مفتاح جديد تحت HKey_Classes_Root\Wow6432Node\AppID.مفتاح جديد يجب أن يتم استدعاء نفس COM كائن GUID.
  4. تحت المفتاح الجديد الذي أضفته ، إضافة قيمة سلسلة جديدة و نسميها DllSurrogate.ترك القيمة فارغة.
  5. إنشاء مفتاح جديد تحت HKey_Local_Machine\Software\Classes\AppID\ مرة أخرى مفتاح جديد يجب أن يتم استدعاء نفس COM كائن GUID.لا قيم ضرورية إضافة هذا المفتاح.

أنا لا الائتمان من أجل الحل ، لكنها عملت بالنسبة لنا.التحقق من مصدر الرابط لمزيد من المعلومات وغيرها من التعليقات.

المصدر: https://techtalk.gfi.com/32bit-object-64bit-environment/

والمشكلة تكمن في أن عملية الخادم هو 64 بت و المكتبة هو 32 بت ومحاولة إنشاء مكون COM في نفس العملية (خادم في بروك). إما إعادة ترجمة الخادم وجعله 32 بت أو ترك الخادم دون تغيير، وجعل المكون COM خارج العملية. أسهل طريقة لجعل الخادم COM خارج العملية لإنشاء تطبيق COM + - لوحة التحكم -> أدوات إدارية -> ComponentServices

ولم أغير أي تجميع الإعدادات.

ومجرد مجموعة "تمكين 32 بت التطبيق = صحيح" في إعدادات متقدمة AppPool.

وعملت بالنسبة لي

الحل لنظام التشغيل windows server 2008 x64 هو:

  1. فتح cmd.exe بإذن المسؤول.
  2. نسخ dll إلى مجلد C:\Windows\SysWOW64
  3. تشغيل regsvr32 من C:\Windows\SysWOW64
  4. تحقق من أن dll في سجل ويندوز.
  5. إذا كنت قد .exe x86 أن استخدام dll, exe يجب أن تكون جمعت في x86 الوضعية.
  6. Exe يجب أن تكون مثبتة في المجلد C:\Program Files (x86)

هذا الإجراء صحيحا ، فإنه على ما يرام.

وكان موضوع ذي صلة مع إصلاح مختلفة، ولكن مماثل:

وكان مشروع خدمة Windows تعيين "أي وحدة المعالجة المركزية" باستخدام DLL 64 بت. رسالة الخطأ نفسه. حاولت في مجمله مجموعة من الأشياء، ولكن لا شيء يعمل. وأخيرا، وذهبت في المشروع خصائص -> بناء ولاحظت زيارتها هذا المشروع "يفضل 32 بت" محددا. لم يتم التحقق منه هذا وليس أكثر من خطأ.

وتخميني هو أن خدمة ويندوز كانت تتوقع DLL 32 بت، ويمكن أن لا تجد.

كان عندي نفس المشكلة ولكن إجابات أخرى فقط زودت جزء واحد من الحل.

الحل هو إضعاف اثنين:

إزالة 64bit من Registery.

  • c:\windows\system32 egsvr32.exe /U
  • هذا لن يزيل المراجع الأخرى نسخ dll في مجلدات أخرى.

أو

  • العثور على المفتاح يسمى HKEY_CLASSES_ROOT\CLSID{......}\InprocServer32.هذا المفتاح سوف يكون اسم ملف DLL مثل قيمته الافتراضية.
  • أزلت HKEY_CLASSES_ROOT\CLSID{......} المجلد.

وتسجيله 32bit:

  • C:\Windows\SysWOW64\regsvr32 <file.dll>

التسجيل على أنها 32bit دون إزالة 64bit التسجيل لا حل مشكلتي.

للتغيير إلى x86:

  1. إنشاء مشروع إعداد الحل الخاص بك.
  2. بعد إنشاء ذلك ، انتقل إلى "مستكشف الحلول" انقر بزر الماوس الأيمن على إعداد المشروع.
    • اضغط إدارة تكوين.
    • اضغط على:"نشط الحل منصة" مربع تحرير وسرد واختر جديد (إذا كان هناك أي x86 عرض)
    • اختر من أول السرد x86 ثم اضغط موافق.
    • بناء مشروع إعداد ، ثم إعادة بناء كل مشروع.

إذا كنت تقوم بتشغيل موقع على شبكة الانترنت، يمكنك أيضا محاولة تعيين تجمع التطبيقات لتعطيل تطبيقات 32 بت (تحت إعدادات متقدمة من بركة).

لأي شخص باستخدام VSTO، كانت مشكلة بالنسبة لي مرجعا المفقودة إلى التجمع office. ويبدو أيضا إذا كنت تحاول مثيل أشياء معينة VSTO يدويا.

في حالة نظري الشخصية تم إصلاح المشكلة في البحث عن معرف فئة في التسجيل ويندوز على الجهاز المطور (لأنه تم طرح هذه القضية في PC العميل). سيتم وضع هذا العمل في مكون COM الذي يسبب المشكلة: على مكتبة إلى x86 المشار إليها في المشروع. NET بلدي الذي لم يتم تسجيله كما OCX / COM بالنسبة المثبت أو التحديث تطبيق

والتحيات

وكانت مشكلتي أنني كان خاطئ النسخة MS تزامن الإطار (1.0) في المراجع مشروعي. بعد التحديث إلى الإصدار 2.1، ذهب الخطأ وحياة جيدة مرة أخرى.

لقد وجدت أن المشكلة تتعلق الفعلية تسجيل DLL.

أولا تشغيل "Regedit.exe" من CMD موجه (رفعت هو مستوى الأمان إلى المسؤول "فقط في حالة") ثم البحث عن التسجيل (من خلال النقر على "تحرير/بحث" في RegEdit القائمة أو بالضغط على Ctrl+F) CLSID يظهر في رسالة الخطأ التي تلقيتها بشأن COM مصنع فئة.بلدي CLSID كان 29AB7A12-B531-450E-8F7A-EA94C2F3C05F.عند هذا المفتاح ، حدد الفرعية الرئيسية "InProcServer2 أن" خلية عقدة التأكد من اسم الملف المشكلة DLL في اليد اليمنى Regedit الإطار.يظهر إطار "الافتراضي" .إذا كان هذا الملف موجود في "C:\Windows\SysWow64"(مثل C:\Windows\SysWow64 edemption.dll") ثم من المهم أن يمكنك استخدام "C:\Windows\SysWow64 egSvr32.exe" ملف تسجيل DLL من سطر الأوامر وليس الافتراضي "C:\Windows\System32 egSvr32.exe" الملف.لذا قمت CMD موجه (تحت المستوى الإداري التحكم (فقط في حالة هذا المستوى هو المطلوب) ثم اكتب في سطر الأوامر (في حالة من DLL):C:\Windows\SysWow64 egSvr32.exe c:\Windows\SysWow64 edemption.dll اضغط مفتاح الإدخال enter.إغلاق نافذة الأوامر (عبر "الخروج" ثم إعادة تشغيل جهاز الكمبيوتر الخاص بك (دائما استخدام إعادة تشغيل بدلا من إغلاق ثم البدء ، منذ (الغريب) إعادة تشغيل أداء شامل أغلقت تحديث كل شيء في حين أن "اغلاق" والسلطة حتى الإعادة تخزين ذاكرة التخزين المؤقت من السائقين وغيرها من القيم (التي قد تكون خاطئة).كلما تسجيل DLL في المستقبل ، تذكر أن استخدام SysWow64 "RegSvr32.exe" أي DLL المخزنة في C:\Windows\SysWow64 المجلد هذه المشكلة ج(إذا كان سببه غير صحيحة تسجيل) لا ينبغي أن يحدث مرة أخرى.

في حالتي، أنا إنتاج ملف مايكروسوفت أوفيس مثل word أو excel، أركض Win+R وتنفيذ dcomcnfg، في تكوين DCOM، إلى جانب تحديد الصلة المكتب البند اسم (مثل يحتوي اسم Excel أو Word أو Office) وOpen the properties, select Identity tab and select the interactive user. كما هذه الإجابة ،

وبلدي خطأ تظهر رسالة CLSID {000209FF-0000-0000-C000-000000000046}، لذلك لا بد لي من محاولة للعثور على هذا CLSID محددة في التكوين DCOM، وأنه لا exsits، وأنا تحديده واتبع نفس الخطوة تعيين interactive user، ثم يعمل.

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