Truy xuất nhà máy lớp COM cho thành phần có CLSID {XXXX} không thành công do lỗi sau: 80040154


278

Tôi đã phát triển một dịch vụ Windows bằng C # .NET để tạo báo cáo PDF. Để tạo tập tin PDF tôi đang sử dụng dll của bên thứ ba. Ứng dụng này đang chạy trong nền tảng Windows XP của tôi. Khi tôi triển khai dịch vụ trong phiên bản Windows Server 2008 64 bit, tôi đã gặp lỗi này:

Truy xuất nhà máy lớp COM cho thành phần với CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} không thành công do lỗi sau: 80040154.

Tôi đã đăng ký DLL bằng cách sử dụng lệnh. Tôi có thể thấy CLSID này trong sổ đăng ký. Nhưng vấn đề vẫn tồn tại.

Điều gì có thể là vấn đề?


1
Một ứng dụng web được lưu trữ trong cùng một máy chủ có thể tạo tệp PDF mà không có bất kỳ lỗi nào.
gopal

Các bạn tôi đã thử mọi giải pháp có thể nhưng vẫn nhận được lỗi này. Tôi đã lắp ráp và đăng ký thành công nhưng vẫn gặp lỗi tương tự. Thực sự cần sự giúp đỡ ...
phát hành

Câu trả lời:


383

Trong VS - thuộc tính dự án - trong tab Xây dựng - mục tiêu nền tảng = X86


7
trong VS2008 tôi đã tìm thấy tùy chọn này trong 'Biên dịch-> Tùy chọn biên dịch nâng cao ...' (ở dưới cùng của tab cửa sổ) và sau đó 'CPU mục tiêu' (x86)
Rodolfo

1
Bạn xứng đáng hơn +1 nhưng +1 là tất cả những gì tôi phải đưa ra
David

7
Đây không phải lúc nào cũng là giải pháp.

2
Bạn đã cứu tôi bảy tài khoản ngân hàng nước ngoài, một quầy bán xúc xích và cuộc hôn nhân của tôi. Cảm ơn bạn
Donald.Record

2
Tôi có thông báo lỗi tương tự nhưng giải pháp này không hiệu quả với tôi.
Akram Khan

59

Tôi gặp phải một vấn đề rất giống nhau.

Tôi cần sử dụng một DLL 32 bit cũ trong Ứng dụng web đang được phát triển trên máy 64 bit. Tôi đã đăng ký DLL 32 bit vào thư mục windows \ sysWOW64 bằng phiên bản regsrv32 trong thư mục đó.

Các cuộc gọi đến DLL của bên thứ ba đã làm việc từ các bài kiểm tra đơn vị trong Visual Studio nhưng không thành công từ Ứng dụng web được lưu trữ trong IIS trên cùng một máy với lỗi 80040154.

Thay đổi nhóm ứng dụng thành "Kích hoạt ứng dụng 32 bit" đã giải quyết vấn đề.


1
Đây là cách dễ nhất mà tôi đã tìm thấy để khắc phục vấn đề này. Cảm ơn!
Dexter

6
Tôi thực sự thích câu trả lời này. Không có điểm nào trong việc biên dịch toàn bộ trang web cho x86 khi bạn chỉ gọi một DLL 32 bit nhỏ tại một số điểm.
DanM7

@Daniel Ballinger Ứng dụng của tôi có chạy quá trình 32 bit để thực hiện thay đổi không?
Novice

@Danny Tôi không tin như vậy, vì nó sẽ không thể truy cập DLL mà tôi đã đăng ký vào sysWOW64.
Daniel Ballinger

1
Tôi có cùng một vấn đề, nhưng tôi không biết làm thế nào để thay đổi nhóm ứng dụng, tôi nên làm điều này ở đâu, xin hãy giúp tôi
Shima.Y

58

Có vẻ như dịch vụ của bạn được xây dựng dựa trên 'Bất kỳ CPU' nào, gây ra lỗi cho bạn trên 64-bit khi bạn đang sử dụng các thành phần COM. Bạn cần phải xây dựng nó cho x86.

Trang web có thể đang chạy như một quy trình 32 bit, đó là lý do tại sao nó có thể sử dụng thành phần này. Xây dựng giải pháp của bạn chống lại x86sẽ buộc dịch vụ của bạn chạy dưới dạng 32 bit.


Tôi cũng phải đối mặt với cùng một problem..here ứng dụng desktop của tôi được cài đặt thành công trên 64bit system..while làm cài đặt tôi done đồng bộ thành công nhưng khi khi tôi làm đồng bộ từ phần mềm của tôi nó được hiển thị cho tôi ở trên lỗi
Mohini Mhetre

Tôi đang cố gắng đăng ký .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)nhưng gặp lỗi Mô-đun không tải được. Đảm bảo rằng tệp nhị phân được lưu trữ tại đường dẫn đã chỉ định hoặc gỡ lỗi để kiểm tra các sự cố với tệp nhị phân hoặc tệp phụ thuộc.
Naveen Kumar

Và nếu nó được biên dịch thành 32-bit, thì nên sử dụng Bộ đệm hệ thống, không phải phiên bản SysWow64.
Fandango68

Tôi gặp lỗi này khi chạy gói SSIS. Các kết nối đang hoạt động tốt. Tất cả các thuộc tính là chính xác. Trên thực tế gói SSIS đã chạy từ nhiều tháng mà không có lỗi. Đột nhiên tôi nhận được lỗi trên. Tôi đã thử thay đổi thời gian chạy / gỡ lỗi thành x86 từ x64 nhưng vấn đề vẫn chưa được giải quyết.
IamVISH

16

Bạn không phải cấu hình mục tiêu nền tảng thuộc tính dự án X86 của bạn. Bạn cũng có thể định cấu hình các tùy chọn iis để hoạt động với x86 như thế

  • Chọn nhóm ứng dụng
  • Chọn nhóm mà ứng dụng của bạn sử dụng
  • Cài đặt nâng cao
  • Kích hoạt ứng dụng 32 bit đúng

Điều này luôn luôn đúng với tôi. Không bao giờ phải đặt mục tiêu nền tảng thành X86 nhưng luôn • Kích hoạt ứng dụng 32 bit = True • Đặt danh tính = ApplicationPoolIdentity • Tải hồ sơ người dùng = True
Zath.

Tôi đã gặp một vấn đề tương tự được khắc phục theo hướng dẫn của Nazim nhưng cũng không phải là "Các loại tương tác nhúng" (một thuộc tính của dll được tham chiếu) và đặt Copy Local = true.
cymorg

Làm thế nào để bạn "Chọn nhóm ứng dụng"?
CodyBugstein

Menu ứng dụng Pools nằm trong danh sách menu iis bên trái
nazim hatipoglu

16

Nếu bạn đang tìm cách để làm cho công việc này hoạt động mà không cần biên dịch lại ứng dụng Bất kỳ CPU nào của bạn, thì đây là một cách giải quyết tiềm năng khác:

  1. Định vị đối tượng COM GUID của bạn trong HKey_Class_Root \ Wow6432Node \ CLSID \ {GUID}
  2. Khi được định vị, thêm Giá trị REG_SZ (chuỗi) mới. Tên phải là AppID và dữ liệu phải là cùng một đối tượng COM GUID mà bạn vừa tìm kiếm
  3. Thêm khóa mới trong HKey_Class_Root \ Wow6432Node \ AppID. Khóa mới phải được gọi giống như đối tượng COM GUID.
  4. Trong khóa mới mà bạn vừa thêm, thêm Giá trị chuỗi mới và gọi nó là DLLSurrogate. Để trống giá trị.
  5. Tạo Khóa mới trong HKey_Local_Machine \ Software \ Classes \ AppID \ Một lần nữa, khóa mới sẽ được gọi giống như GUID của đối tượng COM. Không có giá trị là cần thiết để được thêm vào dưới khóa này.

Tôi không có tín dụng cho giải pháp, nhưng nó đã làm việc cho chúng tôi. Kiểm tra liên kết nguồn để biết thêm thông tin và ý kiến ​​khác.

Nguồn: https://techtalk.gfi.com/32bit-object-64bit-en môi /


1
Hướng dẫn tuyệt vời nhất. Tôi đang sử dụng một công cụ của bên thứ ba, khiến tôi không thể thay đổi nền tảng xây dựng. Giải pháp này phá vỡ vấn đề đó. Cảm ơn bạn!

Tôi đã tìm thấy khóa như bạn đã mô tả ở bước 1, và sau đó tôi biết đối tượng COM nào đang gây rắc rối, sau đó tôi chỉ chạy các chương trình trên đó. Cảm ơn rất nhiều!
MichaelS

Khi tôi làm điều này, máy chủ web cục bộ của tôi (IIS) bắt đầu bị từ chối truy cập. Điều này cho tôi biết đây là một bước đi đúng hướng nhưng tôi không chắc ai sẽ cấp quyền truy cập vào thời điểm này. stackoverflow.com/questions/14019401/ từ
user420667

14

Vấn đề là quá trình máy chủ là 64 bit và thư viện là 32 bit và nó cố gắng tạo thành phần COM trong cùng một quy trình (máy chủ in-Proc). Hoặc bạn biên dịch lại máy chủ và làm cho nó 32 bit hoặc bạn giữ máy chủ không thay đổi và làm cho thành phần COM không hoạt động. Cách dễ nhất để khiến máy chủ COM không hoạt động là tạo ứng dụng COM + - Bảng điều khiển -> Công cụ quản trị -> Dịch vụ thành phần.


Tôi đã gặp lỗi khi cố gắng tạo ứng dụng COM +. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee

8

Tôi đã không thay đổi bất kỳ cài đặt biên dịch.

Chỉ cần đặt "Bật ứng dụng 32 bit = True" trong Cài đặt nâng cao của AppPool.

Nó làm việc cho tôi


1
Cài đặt nâng cao AppPool ở đâu?
CodyBugstein

7

Giải pháp cho máy chủ windows 2008 x64 là:

  1. mở cmd.exe với sự cho phép của Quản trị viên.
  2. Sao chép dll vào thư mục C: \ Windows \ SysWOW64
  3. chạy bộ đệm từ C: \ Windows \ SysWOW64
  4. Xác minh rằng dll có trong sổ đăng ký của Windows.
  5. Nếu bạn có .exe x86 sử dụng dll, exe phải được biên dịch ở chế độ x86.
  6. Phải cài đặt exe trong thư mục C: \ Program Files (x86)

Thủ tục này là hợp lệ, nó là ok.


6

Tôi có cùng một vấn đề, nhưng các câu trả lời khác chỉ cung cấp một phần của giải pháp.

Giải pháp là hai lần:

Loại bỏ 64 bit khỏi Đăng ký.

  • c: \ windows \ system32 \ personas.exe / U
  • Điều này sẽ không loại bỏ các tham chiếu đến bản sao khác của dll trong các thư mục khác.

hoặc là

  • Tìm khóa có tên HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Khóa này sẽ có tên tệp của DLL làm giá trị mặc định.
  • Tôi đã xóa thư mục HKEY_CLASSES_ROOT \ CLSID {......}.

Đăng ký dưới dạng 32 bit:

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

Đăng ký là 32 bit mà không xóa đăng ký 64 bit không giải quyết được vấn đề của tôi.


Chơi lô tô! Đó là câu trả lời tôi đang tìm kiếm (xem ý kiến ​​của tôi ở nơi khác). Cảm ơn!
Fandango68

5

Có một vấn đề liên quan với một sửa chữa khác, nhưng tương tự:

Tôi đã có một dự án dịch vụ Windows được đặt thành "Any-CPU" bằng cách sử dụng DLL 64 bit. Thông báo lỗi tương tự. Đã thử cả đống thứ, nhưng không có gì hiệu quả. Cuối cùng, tôi đã đi vào Thuộc tính dự án -> Xây dựng và nhận thấy rằng dự án đã kiểm tra "Thích 32-bit". Bỏ chọn này và không có lỗi nữa.

Tôi đoán là dịch vụ windows đã mong đợi một DLL 32 bit và không thể tìm thấy nó.


Mặc dù điều đó là lạ nhưng nó hoạt động !! Cảm ơn bạn
FindOutIslamNow

3

Để thay đổi thành x86:

  1. Tạo một dự án thiết lập cho giải pháp của bạn.
  2. Sau khi bạn tạo nó, hãy vào Solution Explorer, nhấp chuột phải vào dự án thiết lập.
    • Nhấn Trình quản lý cấu hình.
    • Nhấp vào: hộp tổ hợp "Nền tảng giải pháp hoạt động" và chọn Mới (Nếu không có x86 hiển thị)
    • Chọn từ combo đầu tiên x86 sau đó nhấn OK.
    • xây dựng lại dự án Setup, sau đó xây dựng lại Tất cả dự án.

3

Nếu bạn đang chạy một trang web, bạn cũng có thể thử đặt nhóm ứng dụng của mình để tắt Ứng dụng 32 bit (trong cài đặt nâng cao của nhóm).


2
Tôi đã ngược lại và phải kích hoạt các ứng dụng 32 bit.
hàng1

2

Trong trường hợp cá nhân của tôi, sự cố đã được khắc phục khi tìm kiếm id lớp trong Sổ đăng ký của Windows trên máy của nhà phát triển (vì sự cố đã được ném vào PC khách). Hành động này sẽ được đặt vào thành phần COM gây ra sự cố: thư viện x86 được tham chiếu trong dự án .NET của tôi không được đăng ký là OCX / COM cho trình cài đặt hoặc ứng dụng cập nhật.

Trân trọng


1

Đối với bất kỳ ai sử dụng VSTO, vấn đề đối với tôi là thiếu một tài liệu tham khảo cho officehội đồng. Nó cũng sẽ xuất hiện nếu bạn đang cố gắng khởi tạo một số đối tượng VSTO bằng tay.


1

Tôi thấy rằng vấn đề của tôi liên quan đến việc đăng ký DLL thực tế.

Trước tiên hãy chạy "Regedit.exe" từ dấu nhắc của CMD (Tôi đã nâng mức bảo mật lên Quản trị viên, "chỉ trong trường hợp") sau đó tìm kiếm Sổ đăng ký (bằng cách nhấp vào "Chỉnh sửa / Tìm" trong menu RegEdit hoặc bằng cách nhấn Ctrl + F) cho CLSID hiển thị trong thông báo lỗi mà bạn nhận được liên quan đến nhà máy lớp COM. CLSID của tôi là 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Khi tìm thấy khóa này, chọn khóa phụ "InProcServer2" bên dưới nút Hive đó và xác định tên tệp của DLL vấn đề trong khung Regedit bên tay phải. hiển thị dưới "Mặc định". Nếu tệp đó nằm trong "C: \ Windows \ SysWow64" (chẳng hạn như C: \ Windows \ SysWow64 \ Redemption.dll ") thì điều quan trọng là bạn phải sử dụng tệp" C: \ Windows \ SysWow64 \ RegSvr32.exe "để đăng ký DLL từ dòng lệnh và KHÔNG mặc định "C: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll khi nhấn enter. Đóng cửa sổ lệnh (thông qua "Thoát" sau đó Khởi động lại máy tính của bạn (luôn sử dụng khởi động lại thay vì Đóng xuống sau đó khởi động, vì (lạ lùng) Khởi động lại thực hiện tắt và tải lại mọi thứ trong khi "Tắt máy" và Bật lại tải lại lưu trữ bộ nhớ cache của trình điều khiển và các giá trị khác (có thể bị lỗi). Bất cứ khi nào bạn đăng ký DLL trong tương lai, hãy nhớ sử dụng SysWow64 "RegSvr32.exe" cho bất kỳ DLL nào được lưu trữ trong thư mục C: \ Windows \ SysWow64 và vấn đề này c (nếu nguyên nhân là do đăng ký không chính xác) không nên xảy ra lần nữa.


Mẹo hay, nhưng chỉ cần lưu ý rằng đăng ký DLL 32 bit trong SysWow64 thì giả sử DLL có trình bao bọc để xử lý các yêu cầu 64 bit.
Fandango68

0

Vấn đề của tôi là tôi đã có phiên bản MS Sync FrameWork (1.0) sai trong Tài liệu tham khảo dự án của tôi. Sau khi cập nhật lên phiên bản 2.1, lỗi đã biến mất và cuộc sống trở lại tốt đẹp.


0

Trong trường hợp của tôi, tôi đang tạo tệp văn phòng ms như wordhoặc excel, tôi chạy Win+Rvà thực thi dcomcnfg, trong Cấu hình DCOM, bên cạnh việc chọn mục tên liên quan đến VĂN PHÒNG (chẳng hạn như tên chứa Excelhoặc Wordhoặc Office) và Open the properties, select Identity tab and select the interactive user.như câu trả lời này ,

Thông báo lỗi của tôi hiển thị CLSID {000209FF-0000-0000-C000-000000000046}, vì vậy tôi phải cố gắng tìm CLSID cụ thể này trong Cấu hình DCOM, và nó không tồn tại, và tôi chọn nó và làm theo cùng một bước đặt interactive user, sau đó nó hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.