การดึงโรงงานคลาส COM สำหรับส่วนประกอบที่มี CLSID {XXXX} ล้มเหลวเนื่องจากข้อผิดพลาดต่อไปนี้: 80040154


278

ฉันพัฒนาบริการ Windows โดยใช้ C # .NET เพื่อสร้างรายงาน PDF ในการสร้างไฟล์ PDF ฉันใช้ dll ของ บริษัท อื่น แอปพลิเคชันทำงานในแพลตฟอร์ม Windows XP ของฉัน เมื่อฉันปรับใช้บริการในWindows Server 2008รุ่น 64 บิตฉันได้รับข้อผิดพลาดนี้:

การดึงโรงงานคลาส COM สำหรับส่วนประกอบด้วย CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} ล้มเหลวเนื่องจากข้อผิดพลาดต่อไปนี้: 80040154

ฉันลงทะเบียน DLL โดยใช้คำสั่ง regsvr32 ฉันสามารถดู CLSID นี้ในรีจิสทรี แต่ปัญหายังคงอยู่

มีปัญหาอะไร


1
เว็บแอปพลิเคชั่นที่โฮสต์ในเซิร์ฟเวอร์เดียวกันสามารถสร้างไฟล์ PDF ได้โดยไม่มีข้อผิดพลาด
gopal

พวกฉันพยายามทุกวิธีแก้ปัญหาที่เป็นไปได้ แต่ยังคงได้รับข้อผิดพลาดนี้ ฉันได้ประกอบและลงทะเบียนพวกเขาประสบความสำเร็จ แต่ยังคงได้รับข้อผิดพลาดเดียวกัน ต้องการความช่วยเหลือจริงๆ ...
newprogress

คำตอบ:


383

ใน VS - คุณสมบัติโครงการ - ในแท็บสร้าง - แพลตฟอร์มเป้าหมาย = X86


7
ใน VS2008 ฉันพบตัวเลือกนี้ภายใต้ 'Compile-> Advanced Compile Options ... ' (ที่ด้านล่างของแท็บหน้าต่าง) จากนั้น 'Target CPU' (x86)
Rodolfo

1
คุณสมควรได้รับมากกว่า +1 แต่ +1 คือทั้งหมดที่ฉันต้องให้
David

7
นี่ไม่ใช่วิธีแก้ปัญหาเสมอไป

2
คุณช่วยฉันบัญชีธนาคารในต่างประเทศเจ็ดบัญชีร้านขายฮอทดอกและการแต่งงานของฉัน ขอบคุณ
Donald.Record

2
ฉันมีข้อความแสดงข้อผิดพลาดเหมือนกัน แต่วิธีนี้ไม่ได้ผลสำหรับฉัน
Akram Khan

59

ฉันพบปัญหาที่คล้ายกันมาก

ฉันจำเป็นต้องใช้ DLL 32 บิตเก่าภายในเว็บแอปพลิเคชันที่ได้รับการพัฒนาบนเครื่อง 64 บิต ฉันลงทะเบียน DLL 32- บิตลงในโฟลเดอร์ windows \ sysWOW64 โดยใช้รุ่น regsrv32 ในโฟลเดอร์นั้น

การเรียกใช้ DLL บุคคลที่สามทำงานจากการทดสอบหน่วยใน Visual Studio แต่ล้มเหลวจากเว็บแอปพลิเคชันที่โฮสต์ใน IIS บนเครื่องเดียวกันกับข้อผิดพลาด 80040154

การเปลี่ยนกลุ่มแอปพลิเคชันเป็น "เปิดใช้งานแอปพลิเคชัน 32 บิต" แก้ไขปัญหาได้


1
นี่เป็นวิธีที่ง่ายที่สุดที่ฉันพบเพื่อแก้ไขปัญหานี้ ขอบคุณ!
ขวา

6
ฉันรักคำตอบนี้จริงๆ ไม่มีจุดรวบรวมเว็บไซต์ทั้งหมดสำหรับ x86 เมื่อคุณเรียก DLL 32 บิตตัวเล็ก ๆ เพียงจุดเดียว
DanM7

@Daniel Ballinger แอปพลิเคชันของฉันจะทำงานเป็นแบบ 32 บิตในการเปลี่ยนแปลงหรือไม่
สามเณร

@ แดนนี่ฉันไม่เชื่อเช่นนั้นเพราะจะไม่สามารถเข้าถึง DLL ที่ฉันลงทะเบียนใน sysWOW64 ได้
Daniel Ballinger

1
ฉันมีปัญหาเดียวกัน แต่ฉันไม่ทราบวิธีการเปลี่ยนแอพพลิเคชั่นซึ่งฉันควรทำอย่างไรโปรดช่วยฉันด้วย
Shima.Y

58

ดูเหมือนว่าบริการของคุณจะถูกสร้างขึ้นด้วย 'CPU ใด ๆ ' ทำให้คุณเกิดข้อผิดพลาดใน 64 บิตเมื่อคุณใช้คอมโพเนนต์ COM x86คุณจำเป็นต้องสร้างมัน

เว็บไซต์อาจใช้กระบวนการแบบ 32 บิตซึ่งเป็นสาเหตุที่ทำให้สามารถใช้องค์ประกอบได้ การสร้างโซลูชันของคุณx86จะบังคับให้บริการของคุณทำงานเป็น 32 บิต


นอกจากนี้ผมยังหันหน้าไปทางเดียวกัน problem..here โปรแกรมคอมพิวเตอร์ของฉันคือการติดตั้งเรียบร้อยแล้วเมื่อวันที่ 64 system..while ดำเนินการติดตั้งผมประสานทำสำเร็จ แต่เมื่อตอนที่ผมทำข้อมูลให้ตรงกันจากซอฟต์แวร์ของฉันมันจะแสดงให้ฉันข้างต้นข้อผิดพลาด
Mohini Mhetre

ฉันพยายามที่จะลงทะเบียน.ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)แต่ได้รับข้อผิดพลาดโมดูลไม่สามารถโหลดได้ ตรวจสอบให้แน่ใจว่าไบนารีถูกเก็บไว้ที่พา ธ ที่ระบุหรือดีบักเพื่อตรวจสอบปัญหาเกี่ยวกับไฟล์ไบนารีหรือไฟล์. DLL
Naveen Kumar

และถ้ามันถูกคอมไพล์เป็น 32 บิตควรใช้ System regsvr32 ไม่ใช่รุ่น SysWow64
Fandango68

ฉันได้รับข้อผิดพลาดนี้ขณะใช้งานแพคเกจ SSIS การเชื่อมต่อใช้งานได้ดี คุณสมบัติทั้งหมดถูกต้อง จริงๆแล้วแพ็คเกจ SSIS นั้นใช้งานมาหลายเดือนโดยไม่มีข้อผิดพลาดใด ๆ ทันใดนั้นฉันก็พบข้อผิดพลาด ฉันลองเปลี่ยน runtime / debugging เป็น x86 จาก x64 ปัญหายังไม่ได้รับการแก้ไข
IamVISH

16

คุณไม่จำเป็นต้องกำหนดค่าแพลตฟอร์มคุณสมบัติโครงการของคุณเป้าหมาย X86 คุณสามารถกำหนดค่าตัวเลือก iis ให้ทำงานกับ x86 เช่นนั้นได้

  • เลือกกลุ่มแอปพลิเคชัน
  • เลือกพูลที่แอพของคุณใช้
  • ตั้งค่าขั้นสูง
  • เปิดใช้งานแอปพลิเคชัน 32 บิตจริง

นี่เป็นเรื่องจริงสำหรับฉันเสมอ ไม่ต้องตั้งค่าเป้าหมายแพลตฟอร์มเป็น X86 แต่เสมอ•เปิดใช้งานแอปพลิเคชั่น 32- บิต = จริง•ตั้งค่าเอกลักษณ์ = ApplicationPoolIdentity •โหลดโปรไฟล์ผู้ใช้ = True
Zath

ฉันมีปัญหาที่คล้ายกันซึ่งได้รับการแก้ไขตามคำแนะนำของ Nazim แต่ต้องไม่ "ฝัง Interop Types" (คุณสมบัติของ dll อ้างอิง) และตั้งค่า Copy Local = true
cymorg

คุณ "เลือกกลุ่มแอปพลิเคชัน" ได้อย่างไร
CodyBugstein

Application Pools menu อยู่ในรายการ iis menu ทางซ้าย
nazim hatipoglu

16

หากคุณกำลังมองหาวิธีที่จะทำให้งานนี้โดยไม่ต้องรวบรวมแอปพลิเคชัน CPU ใด ๆ ของคุณใหม่นี่เป็นวิธีแก้ปัญหาอื่นที่อาจเกิดขึ้น:

  1. ค้นหา GUID วัตถุ COM ของคุณภายใต้ HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  2. เมื่ออยู่แล้วให้เพิ่มค่า REG_SZ ใหม่ (สตริง) ชื่อควรเป็น AppID และข้อมูลควรเป็นวัตถุ COM เดียวกันกับ GUID ที่คุณเพิ่งค้นหา
  3. เพิ่มคีย์ใหม่ภายใต้ HKey_Classes_Root \ Wow6432Node \ AppID คีย์ใหม่ควรถูกเรียกเช่นเดียวกับวัตถุ COM GUID
  4. ภายใต้คีย์ใหม่ที่คุณเพิ่งเพิ่มให้เพิ่มค่าสตริงใหม่และเรียกมันว่า DllSurrogate ปล่อยให้ค่าว่างเปล่า
  5. สร้างคีย์ใหม่ภายใต้ HKey_Local_Machine \ Software \ Classes \ AppID \ อีกครั้งคีย์ใหม่ควรถูกเรียกเช่นเดียวกับ GUID ของวัตถุ COM ไม่จำเป็นต้องเพิ่มค่าใด ๆ ภายใต้คีย์นี้

ฉันไม่ได้รับเครดิตสำหรับการแก้ปัญหา แต่มันได้ผลกับเรา ตรวจสอบลิงค์แหล่งที่มาสำหรับข้อมูลเพิ่มเติมและความคิดเห็นอื่น ๆ

ที่มา: https://techtalk.gfi.com/32bit-object-64bit-environment/


1
คำแนะนำที่ดีที่สุด ฉันใช้เครื่องมือของบุคคลที่สามทำให้ฉันไม่สามารถเปลี่ยนแพลตฟอร์มการสร้างได้ วิธีนี้แก้ไขปัญหาดังกล่าว ขอบคุณ!

ฉันพบกุญแจตามที่คุณอธิบายไว้ในขั้นตอนที่ 1 แล้วฉันก็รู้ว่าวัตถุ COM ตัวใดที่ทำให้เกิดปัญหาจากนั้นฉันก็เรียกใช้ regsvr32 กับมัน ขอบคุณมาก!
MichaelS

เมื่อฉันทำเช่นนี้เว็บเซิร์ฟเวอร์ในพื้นที่ของฉัน (IIS) เริ่มได้รับการเข้าถึงถูกปฏิเสธ นี่บอกฉันว่านี่เป็นขั้นตอนในทิศทางที่ถูกต้อง แต่ฉันไม่แน่ใจว่าใครจะอนุญาตให้เข้าถึง ณ จุดนี้ stackoverflow.com/questions/14019401/…
user420667

14

ปัญหาคือกระบวนการของเซิร์ฟเวอร์คือ 64 บิตและไลบรารีเป็น 32 บิตและพยายามสร้างคอมโพเนนต์ COM ในกระบวนการเดียวกัน (เซิร์ฟเวอร์ใน proc) ไม่ว่าคุณจะคอมไพล์เซิร์ฟเวอร์อีกครั้งและทำให้เป็นแบบ 32 บิตหรือปล่อยให้เซิร์ฟเวอร์ไม่เปลี่ยนแปลงและทำให้คอมโพเนนต์ COM ไม่อยู่ในกระบวนการ วิธีที่ง่ายที่สุดในการทำให้เซิร์ฟเวอร์ COM ไม่อยู่ในกระบวนการคือการสร้างแอปพลิเคชัน COM + - แผงควบคุม -> เครื่องมือการดูแลระบบ -> ComponentServices


ฉันพบข้อผิดพลาดขณะพยายามสร้างแอปพลิเคชัน COM + An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee

8

ฉันไม่ได้เปลี่ยนการตั้งค่าการคอมไพล์

เพียงแค่ตั้งค่า "Enable 32-bit Application = True" ใน AppPool Advanced Settings

มันใช้งานได้สำหรับฉัน


1
การตั้งค่าขั้นสูงของ AppPool อยู่ที่ไหน
CodyBugstein

7

วิธีแก้ปัญหาสำหรับ windows 2008 server x64 คือ:

  1. เปิด cmd.exe ด้วยสิทธิ์ผู้ดูแลระบบ
  2. คัดลอก dll ไปยังโฟลเดอร์ C: \ Windows \ SysWOW64
  3. รัน regsvr32 จาก C: \ Windows \ SysWOW64
  4. ตรวจสอบว่า dll อยู่ในรีจิสทรีของ Windows
  5. หากคุณมี. exe x86 ที่ใช้ dll ไฟล์ exe จะต้องรวบรวมในโหมด x86
  6. ไฟล์ exe ต้องติดตั้งในโฟลเดอร์ C: \ Program Files (x86)

ขั้นตอนนี้ถูกต้องก็โอเค


6

ฉันมีปัญหาเดียวกัน แต่คำตอบอื่น ๆ ให้มาเพียงส่วนหนึ่งของการแก้ปัญหา

การแก้ปัญหาคือสองเท่า:

ลบ 64 บิตออกจาก Registery

  • c: \ windows \ system32 \ regsvr32.exe / U
  • สิ่งนี้จะไม่ลบการอ้างอิงไปยัง dll ที่คัดลอกมาอื่น ๆ ในโฟลเดอร์อื่น

หรือ

  • ค้นหาคีย์ที่เรียกว่า HKEY_CLASSES_ROOT \ CLSID {...... } \ InprocServer32 คีย์นี้จะมีชื่อไฟล์ของ DLL เป็นค่าเริ่มต้น
  • ฉันลบโฟลเดอร์ HKEY_CLASSES_ROOT \ CLSID {...... } แล้ว

ลงทะเบียนเป็น 32 บิต:

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

การลงทะเบียนเป็น 32 บิตโดยไม่ลบการลงทะเบียน 64 บิตไม่สามารถแก้ไขปัญหาของฉันได้


บิงโก! นั่นคือคำตอบที่ฉันต้องการ (ดูความเห็นของฉันที่อื่น) ขอบคุณ!
Fandango68

5

มีปัญหาที่เกี่ยวข้องกับการแก้ไขที่แตกต่างกัน แต่คล้ายกัน:

ฉันตั้งค่าโปรเจ็กต์บริการ Windows เป็น "Any-CPU" โดยใช้ DLL 64 บิต ข้อความแสดงข้อผิดพลาดเดียวกัน ลองใช้สิ่งต่าง ๆ มากมาย แต่ไม่มีอะไรทำงาน ในที่สุดฉันก็เข้าสู่ Properties Properties -> Build และสังเกตว่าโปรเจ็กต์นั้นได้รับการตรวจสอบว่า ยกเลิกการเลือกนี้และไม่มีข้อผิดพลาดอีกต่อไป

ฉันเดาว่าบริการ windows คาดว่าจะเป็น DLL 32 บิตและไม่สามารถหาได้


แม้ว่ามันจะแปลก แต่ก็ใช้งานได้ !! ขอบคุณ
FindOutIslamNow

3

วิธีเปลี่ยนเป็น x86:

  1. สร้างโครงการติดตั้งสำหรับโซลูชันของคุณ
  2. หลังจากที่คุณสร้างไปที่ Solution Explorer คลิกขวาที่โครงการติดตั้ง
    • กดเครื่องมือจัดการการกำหนดค่า
    • คลิกที่: combobox "Active Solution Platform" และเลือกใหม่ (หากไม่มี x86 แสดง)
    • เลือกจากคอมโบแรก x86 จากนั้นกดตกลง
    • สร้างโครงการติดตั้งใหม่จากนั้นสร้างโครงการทั้งหมดอีกครั้ง

3

หากคุณใช้งานเว็บไซต์คุณสามารถลองตั้งกลุ่มแอพพลิเคชั่นของคุณให้ปิดการใช้งานแอพพลิเคชั่นแบบ 32 บิต (ภายใต้การตั้งค่าขั้นสูงของกลุ่ม)


2
ฉันมีสิ่งที่ตรงกันข้ามและต้องเปิดใช้งานแอปพลิเคชัน 32 บิต
row1

2

ในกรณีส่วนบุคคลของฉันปัญหาได้รับการแก้ไขแล้วในการค้นหา id คลาสในรีจิสทรีของ Windows บนเครื่องนักพัฒนา (เนื่องจากปัญหาถูกโยนลงในพีซีไคลเอ็นต์) การกระทำนี้จะถูกวางลงในคอมโพเนนต์ COM ที่ทำให้เกิดปัญหา: ไลบรารี x86 ที่อ้างอิงในโครงการ. NET ของฉันที่ไม่ได้ลงทะเบียนเป็น OCX / COMสำหรับแอปพลิเคชันตัวติดตั้งหรือตัวอัปเดต

ความนับถือ


1

สำหรับใครก็ตามที่ใช้ VSTO ปัญหาสำหรับฉันคือการอ้างอิงที่ขาดหายไปจากofficeชุดประกอบ มันจะปรากฏขึ้นหากคุณพยายามสร้างอินสแตนซ์วัตถุ VSTO บางอย่างด้วยตนเอง


1

ฉันพบว่าปัญหาของฉันเกี่ยวข้องกับการลงทะเบียน DLL จริง

ก่อนอื่นให้รัน "Regedit.exe" จากพรอมต์ CMD (ฉันยกระดับความปลอดภัยให้กับผู้ดูแลระบบ "ในกรณี") จากนั้นค้นหารีจิสทรี (โดยคลิกที่ "แก้ไข / ค้นหา" ในเมนู RegEdit หรือกด Ctrl + F) สำหรับ CLSID ที่แสดงในข้อความแสดงข้อผิดพลาดที่คุณได้รับเกี่ยวกับโรงงานคลาส COM CLSID ของฉันคือ 29AB7A12-B531-450E-8F7A-EA94C2F3C05F เมื่อพบคีย์นี้ให้เลือกคีย์ย่อย "InProcServer2" ภายใต้โหนด Hive นั้นและยืนยันชื่อไฟล์ของ DLL ปัญหาในเฟรม Regedit ทางขวามือ แสดงภายใต้ "ค่าเริ่มต้น" หากไฟล์นั้นอยู่ใน "C: \ Windows \ SysWow64" (เช่น C: \ Windows \ SysWow64 \ Redemption.dll ") ดังนั้นเป็นสิ่งสำคัญที่คุณต้องใช้ไฟล์" C: \ Windows \ SysWow64 \ RegSvr32.exe "เพื่อ ลงทะเบียน DLL นั้นจากบรรทัดคำสั่งและไม่ใช่ค่าเริ่มต้น "C: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dllกด Enter ปิดหน้าต่างคำสั่ง (ผ่านทาง "ออก" จากนั้นรีสตาร์ทคอมพิวเตอร์ของคุณ (ใช้การเริ่มระบบใหม่แทนการปิดเครื่องแล้วเริ่มต้นใหม่เนื่องจาก (แปลก) รีสตาร์ททำการปิดเครื่องอย่างละเอียดและโหลดใหม่ทุกอย่างในขณะที่ "ปิดเครื่อง" และเปิดเครื่องใหม่ แคชที่เก็บไว้ของไดรเวอร์และค่าอื่น ๆ (ซึ่งอาจผิดพลาด) เมื่อใดก็ตามที่คุณลงทะเบียน DLL ในอนาคตอย่าลืมใช้ SysWow64 "RegSvr32.exe" สำหรับ DLL ใด ๆ ที่เก็บไว้ในโฟลเดอร์ C: \ Windows \ SysWow64 และปัญหานี้ (ถ้ามันเกิดจากการลงทะเบียนไม่ถูกต้อง) ไม่ควรเกิดขึ้นอีก


เคล็ดลับที่ยอดเยี่ยม แต่เพิ่งทราบว่าการลงทะเบียน 32 บิต DLL ใน SysWow64 นั้นจะถือว่า DLL มีตัวห่อหุ้มเพื่อจัดการกับคำขอ 64 บิต
Fandango68

0

ปัญหาของฉันคือฉันมีรุ่น MS Sync FrameWork (1.0) ผิดในการอ้างอิงโครงการ หลังจากอัปเดตเป็นเวอร์ชัน 2.1 แล้วข้อผิดพลาดก็หายไปและอายุการใช้งานก็ดีขึ้นอีกครั้ง


0

ในกรณีของฉันฉันผลิตไฟล์ MS Office เช่นwordหรือexcelผมใช้Win+Rและดำเนินการdcomcnfgในการกำหนดค่า DCOM นอกเหนือจากการเลือกที่เกี่ยวข้อง OFFICE รายการชื่อ (เช่นชื่อประกอบด้วยExcelหรือWordหรือOffice) และOpen the properties, select Identity tab and select the interactive user.เป็นคำตอบนี้ ,

ข้อความแสดงข้อผิดพลาดของฉันแสดงCLSID {000209FF-0000-0000-C000-000000000046}ดังนั้นฉันต้องพยายามค้นหา CLSID นี้เฉพาะในการกำหนดค่า DCOM และมันออกจากและฉันเลือกและทำตามขั้นตอนเดียวกันตั้งinteractive userแล้วก็ใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.