Thay vì gọi regsvr32.exe, người ta có thể đăng ký một DLL sử dụng các bước sau:Programatically đăng ký của .dll trên Windows Vista (sử dụng EFS)
HINSTANCE hLib = ::LoadLibraryEx(dllPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
HRESULT (STDAPICALLTYPE* lpDllEntryPoint)(void);
(FARPROC&)lpDllEntryPoint = ::GetProcAddress(hLib, "DllRegisterServer");
const HRESULT hRes = (*lpDllEntryPoint)();
này hoạt động tốt trên Windows XP. Đáng tiếc, nó không thành công trên Vista, nhưng chỉ với một số DLL cụ thể. hRes
trở thành E_ACCESSDENIED. Tôi đoán đây là một vấn đề an ninh. Có ai biết làm thế nào để đăng ký một. DLL từ mã trên Windows Vista?
Lưu ý: Tôi đã đăng nhập với tư cách quản trị viên khi chạy mã này.
Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Đáng tiếc, nó không giải quyết được vấn đề của tôi, vì tôi thậm chí không chạy ở chế độ UAC. –
nó sẽ/nên là một vấn đề cụ thể với dll com bạn đang cố gắng để đăng ký. Không có lý do thực sự nào mà dll com sẽ thất bại trong Vista nếu được đăng ký trực tiếp từ tài khoản quản trị viên nâng cao. Có lẽ regsvr32.exe khởi tạo COM căn hộ trước khi gọi DllRegisterServer? (nghĩa là bạn cần gọi CoInitialize?) Nếu bạn tạo dll com của riêng mình và gỡ lỗi mã đăng ký được gọi trực tiếp, hãy đảm bảo rằng bạn sẽ không nhận thấy bất kỳ sự cố nào. –
Bạn đã đúng! Vấn đề xảy ra chỉ với một số DLL. Rõ ràng, đoạn mã đã cho hoạt động tốt cho hầu hết các tệp DLL. –