2011-12-16 49 views
7

Tôi đang viết một thành phần DLL nhỏ cần truy cập vào hai thành phần của bên thứ ba để kết hợp dữ liệu, một trong số đó chỉ có 32 bit và cái kia chỉ là 64 bit. Cả hai đều được đăng ký với một TypeLib và tự động tương thích, do đó, marshalling không phải là một vấn đề.COM thay thế cho thành phần của bên thứ ba

Nếu tôi hiểu tài liệu chính xác, thì không có cách nào để buộc tải trong đại diện trừ khi thành phần cũng có một AppID và khóa DllSurrogate; vì cả hai đều là thành phần của bên thứ ba, tôi hơi miễn cưỡng sửa đổi đăng ký của họ. Có một cách để kích hoạt một đối tượng trong một thành phần mà không có một AppID trong một quá trình thay thế từ một thành phần DLL lý tưởng không có thêm bất kỳ phụ thuộc nào không, hoặc bất cứ ai có thể giải thích cho tôi tại sao điều này sẽ là một ý tưởng tồi không? Không.

+1

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682432% 28v = vs.85% 29.aspx –

+1

Không phải người thay thế tùy chỉnh cũng yêu cầu thành phần máy chủ phải có một AppID, vì vậy COM biết thay thế nào để khởi tạo lớp trong ? Nếu tôi thêm rằng, điều này sẽ ảnh hưởng đến tất cả các khách hàng, không chỉ là thành phần của tôi, mà tôi muốn tránh (cũng, thay thế tiêu chuẩn nên làm việc tốt). –

+0

[Raymond Chen] (http://blogs.msdn.com/b/oldnewthing/archive/2009/02/12/9413816.aspx) gợi ý rằng Explorer có thể bằng cách nào đó các đối tượng 'CoCreateInstance' không được đăng ký với * DllSurrogate * chìa khóa để chúng được tạo ra trong một đại diện - tôi muốn được quan tâm như thế nào. –

Trả lời

6

Có, bạn có thể tải một (ví dụ) 32-bit chỉ DLL trong một đại diện, và truy cập nó từ một quá trình 64-bit, theo cách sau. Điều này sẽ làm việc cung cấp có một marshaller có sẵn, mà nói chung sẽ có một thành phần với một typelib bởi vì họ thường sử dụng marshaller tiêu chuẩn. Nó sẽ không hoạt động nếu đối tượng requries một prox/stub tùy chỉnh bởi vì các phiên bản 64 bit sẽ không tồn tại, hoặc bạn sẽ không có vấn đề này ở nơi đầu tiên.

Trước tiên, bạn cần có một AppID. Nếu DLL đã có một AppID, bạn nên sử dụng nó. Bạn có thể tìm hiểu bằng cách kiểm tra theo khóa CLSID cho CoClass mà bạn quan tâm.

Ví dụ được sử dụng ở đây là các lớp học Capicom.HashedDataCapicom.EncryptedData. Capicom chỉ có 32 bit.

Bạn nên sử dụng phiên bản 32 bit của Regedit để thực hiện việc này, vì nó là một thành phần 32 bit. Nếu bạn có thành phần 64 bit bạn muốn truy cập từ 32 bit, hãy sử dụng thành phần khác. (Điều này là do việc ảo hóa registry cho lớp tương thích 32-bit- sử dụng phiên bản bitmap phù hợp của regedit sẽ giải quyết vấn đề này cho bạn, bằng cách đảm bảo bạn chỉnh sửa phiên bản đăng ký ảo đúng).

Windows Registry Editor Version 5.00 


;;; Capicom AppID - just using the Capicom.EncryptedData CLSID 
;;; Use default surrogate = empty string 
[HKEY_CLASSES_ROOT\AppID\{A440BD76-CFE1-4D46-AB1F-15F238437A3D}] 
"DllSurrogate"="" 

;;; Capicom.EncryptedData 
[HKEY_CLASSES_ROOT\CLSID\{A440BD76-CFE1-4D46-AB1F-15F238437A3D}] 
AppID="{A440BD76-CFE1-4D46-AB1F-15F238437A3D}" 

;;; Capicom.HashedData - use same AppID for all!!!!! 
[HKEY_CLASSES_ROOT\CLSID\{CE32ABF6-475D-41F6-BF82-D27F03E3D38B}] 
AppID="{A440BD76-CFE1-4D46-AB1F-15F238437A3D}" 

Lưu vào một tệp myComponent-dllhost.reg và tránh xa.

c:\windows\sysWow64\regedit.exe "myComponent-dllhost.reg" 

Bây giờ bạn có thể truy cập Capicom.HashedData và Capicom.EncryptedData từ máy chủ 64 bit/COM.

Ghi chú:

  • chỉ này hoạt động cho OLE Automation loại cơ bản. Bất kỳ đối tượng nào tương thích với các kịch bản lệnh Windows Scripting Host trong VBScript hoặc JavaScript sẽ là OK.
  • Bạn chỉ phải thêm AppID vào các đối tượng có thể tạo trực tiếp. Đó là cơ bản những người có một mục InprocServer32. Các đối tượng được tạo ra từ các nhà máy hoặc chỉ có sẵn dưới dạng đối tượng con không cần phải thêm AppID.
  • Nếu đã có một AppID, tất cả những gì bạn cần làm là thêm mục nhập "DllSurrogate" trống. Đó là nó!
  • điều này sẽ NOT ảnh hưởng đến các máy khách thông thường của DLL. Miễn là bit-ness phù hợp, chúng sẽ tiếp tục được nạp trong quá trình như trước. Sự khác biệt duy nhất nó sẽ tạo ra là nó sẽ trở thành có thể để nhanh chóng nó ra khỏi quá trình từ một khách hàng của một bitness khác nhau.
+0

Tôi đã làm việc đó, nhưng tôi cảm thấy miễn cưỡng khi sửa đổi đăng ký các thành phần khác (trong trường hợp này là Lotus Notes và Rational ClearCase) từ trình cài đặt của tôi, vì vậy tôi tự hỏi liệu có cách nào để làm điều này mà không sửa đổi registry . –

+2

Đừng ngại! OTOH, nếu bạn thực sự muốn, bạn có thể tạo một đối tượng helper com với cùng một bit, mà chỉ có một phương thức 'HRESULT CreateObject ([trong] BSTR progID, [out, retval] IUnknown ** ppRetVal)'. Điều đó tạo ra đối tượng bên trong đại diện và trả lại cho bạn. – Ben

+0

Đó là một ý tưởng hay. –

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