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.HashedData
và Capicom.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.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682432% 28v = vs.85% 29.aspx –
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). –
[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. –