2013-03-25 22 views
6

Khi instantiating một đối tượng COM Interop:Instantiating một phần COM không thành công với "Lớp không đăng ký" khi "Run As Administrator"

var comObj = new ComComponentClass(); 

tôi nhận được COMException:

Retrieving the COM class factory for component with CLSID 
{C343ED84-A129-11D3-B799-0060B0F159EF} failed due to the following error: 
80040154 Class not registered 
(Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). 

tôi chỉ gặp lỗi này khi tôi khởi chạy ứng dụng của mình với Chạy với tư cách là Quản trị viên. Khi tôi chạy bình thường, lỗi không xảy ra.

Ghi chú:

  • Ứng dụng này là ứng dụng 64-bit.
  • Thành phần COM là máy chủ inproc trong dll 64 bit.

Bất kỳ ý tưởng nào về nơi tôi nên bắt đầu điều tra lý do sự khác biệt này xảy ra?

Những gì tôi đã cố gắng:

Tôi đã sử dụng ProcMon để xem những gì các khóa registry nó kiểm tra.

  • Trong cả hai trường hợp, dll thích hợp được xác định bằng cách kiểm tra phím HKCU\Software\Classes\CLSID\{C343ED84-A129-11d3-B799-0060B0F159EF}\InprocServer32
  • Trong cả hai trường hợp, nó truy vấn chính HKCR\CLSID\{C343ED84-A129-11D3-B799-0060B0F159EF} và được trở lại NAME NOT FOUND. Mà tôi thấy lạ (kể từ khi tôi có thể thấy rằng chìa khóa sử dụng regedit.exe. Nhưng vì điều này không khác nhau giữa hai kịch bản, nó không có vẻ quan trọng.

Trả lời

4

Bạn đã đăng ký đối tượng cho tài khoản người dùng cục bộ của bạn mà không hành chính Vì vậy, thành phần COM được đăng ký theo khu vực người dùng cụ thể của sổ đăng ký (như bạn đã chỉ ra: HKC * U *). chạy mà không có quyền quản trị, nó được trình bày với một khung nhìn hợp nhất của sổ đăng ký HKCR, bao gồm tất cả các mục HKCU \ Software \ Classes cộng với bất cứ thứ gì trong HKLM \ Software \ Classes t mũ không bị ghi đè trong HKCU \ Software \ Classes. Khi một tiến trình chạy với tư cách quản trị viên, đăng ký chỉ hiển thị các mục HKLM \ Software \ Classes.

Xem liên kết này để biết thêm chi tiết: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724498(v=vs.85).aspx

Điều lạ là, regsvr32 sẽ không đăng ký dưới HKCU \ chìa khóa lớp. Nếu bạn chạy nó mà không có quyền quản trị, nó sẽ chỉ thất bại (chỉ cần kiểm tra để đảm bảo, trong Windows 7). Thành phần COM đã được đăng ký như thế nào?

+0

Tôi đoán là: anh ấy đã cài đặt nó từ MSI và chọn tùy chọn "chỉ cài đặt cho người dùng này". –

+0

Trình cài đặt đã cài đặt nó, nhưng không có tùy chọn "chỉ cài đặt cho người dùng này". Vì vậy, các bước tiếp theo là tìm hiểu cách thức đăng ký. Rất cám ơn vì lời giải thích. –