2012-06-18 4 views
9

Có thể sử dụng đối tượng COM từ DLL mà không cần đăng ký bằng mã C++ không được quản lý không?Sử dụng đối tượng COM từ DLL mà không cần đăng ký

+0

@NahumLitvin, bạn có thể cho biết thư viện nào bạn quan tâm cụ thể không? – acelent

+0

Thật không may là tôi không thể. thông tin không phải của tôi để cung cấp. Tôi có một dll com. và một ví dụ làm việc với đăng ký. nhưng tôi không thể sử dụng đăng ký. – Nahum

+0

Tại sao bạn không đặt câu hỏi mới? Tại sao bạn không thể sử dụng đăng ký miễn phí COM (xem một trong những câu trả lời)? Bạn có thử phương pháp được giải thích trong câu trả lời khác không? Nếu nó không hoạt động, bạn đã gặp lỗi trong bước nào? Thực sự, điều này không dành một khoản tiền thưởng cho một câu hỏi đã được trả lời, đây là câu hỏi riêng của nó. Bạn cần cung cấp nhiều chi tiết hơn nếu bạn thực sự muốn được giúp đỡ, thay vì chỉ tung ra các điểm danh tiếng. – acelent

Trả lời

8

Có, nếu nó không phụ thuộc nội bộ vào các đối tượng đã đăng ký khác.

  1. Bạn LoadLibrary DLL
  2. Bạn GetProcAddressDllGetClassObject
  3. Bạn gọi DllGetClassObject để có được IClassFactory con trỏ cho CLSID quan tâm
  4. Bạn đang tốt để đi với IClassFactory::CreateInstance và nhanh chóng các coclass
+4

2 ½. Hãy chắc chắn rằng bạn đang ở trong căn hộ chính xác trước khi gọi 'DllGetClassObject'. Mặc dù vậy, bạn sẽ không nhận được marshaling cho các giao diện mô hình đối tượng cụ thể. Ngay cả khi các đối tượng C++ COM thực hiện 'IMarshal' hoặc' IProvideClassInfo', bạn sẽ cần thực hiện tương tự nếu bạn là người cung cấp các đối tượng thực hiện bất kỳ giao diện nào trong số đó (ví dụ: sự kiện dispinterfaces). Vì những lý do này và nhiều lý do khác, đây là thực hành không tốt. Bạn nên sử dụng đăng ký miễn phí COM thay thế. – acelent

2

Giả sử, COM DLL cần phải được đăng ký, nhưng ứng dụng không có quyền truy cập quản trị. Dưới đây là một hack dễ dàng để đăng ký DLL dưới HKEY_CURRENT_USER, mà không yêu cầu quyền quản trị:

  1. Sử dụng LoadLibrary để nạp DLL COM.
  2. Gọi GetGetProcAddress để nhận địa chỉ DllRegisterServer.
  3. Gọi RegOverridePredefKey để thực hiện chuyển hướng đăng ký tạm thời: HKEY_LOCAL_MACHINE đến HKEY_CURRENT_USERHKEY_CLASSES_ROOT đến HKEY_CURRENT_USER\Software\Classes.
  4. Gọi DllRegisterServer thu được ở bước 2.
  5. Đảo ngược chuyển hướng đăng ký.
  6. Sử dụng máy chủ COM như thường lệ, hiện được đăng ký theo HKEY_CURRENT_USER.
+1

hack "dễ dàng". Mặc dù thông minh. – Dmitry