2009-09-07 26 views
5

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.

Trả lời

5

Đăng ký COM yêu cầu quyền ghi vào phần HKEY_LOCAL_MACHINE của sổ đăng ký.

Trong UAC, quyền truy cập ghi vào HKEY_LOCAL_MACHINE yêu cầu một quản trị viên được nâng cao.

Cách dễ nhất để có được quy trình nâng cao là tạo ra nó bằng tệp kê khai chỉ định quyền truy cập 'requireAdministrator'. - Nhìn vào thuộc tính Project -> Configuration Properties-> Linker-> Manifest File-> UAC Execution Level để cài đặt đúng.

Điều này có nghĩa là bạn có thể muốn chia EXE thành hai phần. Phần 'bình thường' asInvoker, và, khi tự đăng ký được phát hiện là một yêu cầu, một phần InstallMyself cao. Khi phần không nâng cao phát hiện một điều kiện kiểu đầu tiên, nó cần sử dụng ShellExecute (Ex) để thực hiện phần FirstInstall.exe - sử dụng CreateProcess hoặc một số API khác sẽ đơn giản thất bại với một lỗi đặc quyền không đủ. ShellExecute sẽ trình bày nhắc nhở UAC.

Có thể sử dụng Application Isolation để tải COM dll mà không cần bất kỳ bước đăng ký nào cả.


Thật không may là nguyên nhân không thể xác định được. Tuy nhiên, nếu bạn quan tâm đến việc nghiên cứu thêm, một công cụ sẽ giúp ích rất nhiều sẽ là Process Monitor từ SysInternals. Process Monitor có thể ghi tất cả File, Registry và các truy cập khác cho một quá trình, bao gồm tất cả các mã thành công và thất bại, giúp dễ dàng gỡ lỗi các vấn đề như thế này mà không phải sử dụng các kỹ thuật đảo ngược sâu hơn.

+0

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. –

+0

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. –

+0

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. –

1

Đáng tiếc, tôi không thể làm việc này cho tất cả các tệp DLL, ngay cả với Chris Becke's các mẹo tuyệt vời. Tôi không muốn tốn quá nhiều thời gian giải quyết vấn đề, vì vậy bây giờ tôi chỉ cần gọi regsvr32.exe. Tôi mong đợi điều này .exe có mặt trên tất cả các máy Windows, vì vậy tôi đoán nó là một giải pháp đủ tốt.

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