2013-08-01 40 views
8

Chạy một ứng dụng từ Visual Studio 2012 trên các máy tính 64-bit, hiển thị thông báo lỗi sau:Class không đăng ký Lỗi

Retrieving the COM class factory for component with CLSID {F2D4F4E5-EEA1-46FF-A83B-A270C92DAE4B} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Tôi đang sử dụng thư viện dll Inventor packandgo trong VisualStudio.

Bất kỳ ai biết lỗi là gì?

+0

Có * hàng trăm * câu hỏi về mã lỗi này. Bạn ** phải ** giải thích tại sao bạn lại khác. Với vấn đề bổ sung mà bạn đang la hét để được giúp đỡ trong một sân vận động bóng đá đông đúc trong khi bạn nên nói chuyện với ai đó mà làm việc cho "nhà phát minh packandgo", bất cứ ai họ đang có. –

Trả lời

18

Vấn đề của tôi và các giải pháp

  1. Tôi có một dll bên thứ ba 32 bit mà tôi đã được cài đặt trong máy 2008 R2 là 64 bit.

  2. Tôi có dịch vụ wcf được tạo trong đó.net 4.5 framework gọi 32 bit của bên thứ ba để xử lý. Bây giờ tôi đã xây dựng thuộc tính được thiết lập để nhắm mục tiêu cpu 'bất kỳ' và triển khai nó đến máy 64 bit.

  3. Khi Ii cố gắng để gọi dịch vụ WCF đã nhận lỗi "80.040.154 Class không đăng ký (ngoại lệ từ HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG"

  4. Bây giờ Ii sử dụng ProcMon.exe để theo dõi các vấn đề com đăng ký và xác định rằng quá trình tìm kiếm mục đăng ký tại HKLM \ CLSID và HKCR \ CLSID nơi không có mục nhập nào.

  5. Đến để biết rằng Microsoft sẽ không đăng ký thành phần com 32 bit cho đường dẫn HKLM \ CLSID, HKCR \ CLSID trong Máy 64 bit thay vì nó đặt mục nhập trong đường dẫn HKLM \ Wow6432Node \ CLSID và HKCR \ Wow6432Node \ CLSID.

  6. Bây giờ xung đột là quá trình 64 bit đang cố gắng gọi quy trình 32 bit trong máy 64 bit sẽ tìm kiếm mục đăng ký trong HKLM \ CLSID, HKCR \ CLSID. Giải pháp là chúng ta phải bắt buộc quá trình 64 bit xem xét mục đăng ký tại HKLM \ Wow6432Node \ CLSID và HKCR \ Wow6432Node \ CLSID.

  7. Điều này có thể đạt được bằng cách định cấu hình thuộc tính dự án dịch vụ wcf để nhắm mục tiêu đến máy 'X86' thay vì 'Bất kỳ'.

  8. Sau khi triển khai phiên bản 'X86' đến server 2008 R2 có vấn đề "System.BadImageFormatException: Không thể tải tập tin hoặc lắp ráp"

  9. Giải pháp để badimageformatexception này được thiết lập 'Enable32bitApplications' để 'True' trong thuộc tính IIS Apppool cho apppool phù hợp.

+1

@RohitGupta viên đạn cuối cùng có vẻ là giải pháp :-) – kleopatra

+0

@kleopatra, vậy là xong. Tôi đã chỉnh sửa nó để làm nổi bật giải pháp từ. Và tôi đã xóa nhận xét của mình. Nhưng tôi không thể hoàn tác lá cờ mà tôi đã nêu ra. Và tôi đã upvoted nó. –

+0

BRIL! Không chỉ là một giải pháp mà là một nguyên nhân gốc mô tả chi tiết (ít nhất là trong trường hợp của tôi). Nhiều đánh giá cao. –

3

Một nơi nào đó trong mã bạn đang sử dụng, có một cuộc gọi đến API Win32, CoCreateInstance, để tải động DLL và khởi tạo một đối tượng từ nó.

Ánh xạ giữa ID thành phần và DLL có khả năng khởi tạo đối tượng đó thường được tìm thấy trong HEKY_CLASSES_ROOT \ CLSID trong sổ đăng ký. Để thảo luận về điều này hơn nữa sẽ là để giải thích rất nhiều về COM in Windows. Nhưng lỗi chỉ ra rằng COM guid không có trong sổ đăng ký.

Tôi không biết gì về PackAndGo DLL (thành phần Autodesk), nhưng tôi nghi ngờ bạn chỉ cần "cài đặt" thành phần đó hoặc gói phần mềm đi kèm với trình cài đặt được chỉ định để có DLL đó và thích hợp Các khóa đăng ký COM trên máy tính của bạn mà bạn đang cố gắng chạy mã của mình. (tức là hãy chạy setup.exe cho sản phẩm này).

Nói cách khác, tôi nghĩ bạn cần phải cài đặt "Gói và Đi" trên máy tính này thay vì chỉ sao chép tệp DLL vào máy mục tiêu.

Ngoài ra, hãy chắc chắn rằng bạn quyết định xây dựng mã của bạn thích hợp như 32-bit so với 64-bit tùy thuộc vào việc xây dựng hương vị (32 hoặc 64 bit) của Pack And Go bạn cài đặt.

1

Trong máy tính Windows 64 bit, các thành phần COM cần đăng ký chính nó trong HKEY_CLASSES_ROOT \ CLSID (thành phần 64 bit) HOẶC HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID (thành phần 32 bit). Nếu ứng dụng của bạn là ứng dụng 32 bit chạy trên máy 64 bit, thư viện COM thường sẽ tìm GUID dưới nút Wow64 và nếu ứng dụng của bạn là ứng dụng 64 bit, thư viện COM sẽ cố tải từ HKEY_CLASSES_ROOT \ CLSID. Đảm bảo bạn đang nhắm mục tiêu nền tảng chính xác và đảm bảo bạn đã cài đặt đúng phiên bản thư viện (32/64 bit).

4

Vấn đề là DLL được đăng ký trên phiên bản 32 bit của sổ đăng ký cửa sổ và ứng dụng đang sử dụng phiên bản 64 bit.

Solution: Go into the Project Properties, Compile tab and click "Advanced Compile Options...". Change "Target CPU" to x86, click OK, save and try again.

Nguồn: http://www.theogray.com/blog/2009/10/comexception-regdbeclassnotreg-on-64-bit-windows

Đã làm việc cho tôi với một VB 6 COM DLL gọi từ một ứng dụng Net 4 Winforms

0

Tôi có vấn đề này và tôi giải quyết nó khi tôi đã hiểu rằng nó đang tìm kiếm Windows Registry được chỉ định trong dấu ngoặc đơn.

Vì lỗi xảy ra chỉ trong một máy tính, nên tôi phải xuất khẩu sổ đăng ký từ máy tính đang hoạt động và cài đặt nó trên máy tính bị thiếu.

0

Giải quyết lâu dài Tôi chắc chắn nhưng điều này có thể giúp một số linh hồn nghèo khác.

Lỗi này có thể ocurre nếu DLL bạn đang triển khai trong gói cài đặt là không giống như các DLL bạn đang tham chiếu (những sẽ có ID khác nhau)

Âm thanh rõ ràng nhưng có thể dễ dàng xảy ra nếu bạn thực hiện một nhỏ thay đổi vào dll và trước đó đã cài đặt ứng dụng trên máy của riêng bạn để đăng ký lại dll.

Các vấn đề liên quan