2010-02-05 26 views
7

Tôi đang viết một DLL để cắm vào ứng dụng (bên thứ 3) khác. Các DLL sẽ cần phải phụ thuộc vào một tập hợp các DLL (vì lý do giấy phép tôi không thể liên kết tĩnh).Plugin DLL phụ thuộc vào các tệp DLL khác

Tôi muốn tệp DLL của mình được "xcopy-deployable" vào bất kỳ thư mục nào. Tôi cũng không muốn yêu cầu thêm thư mục này vào đường dẫn.

Nếu tôi chỉ xây dựng DLL theo cách thông thường, Windows sẽ từ chối tải tệp DLL vì nó không thể tìm thấy tệp DLL bên cạnh quy trình hiện tại.

Có tùy chọn nào tốt để giúp Windows định vị tệp DLL không?


Để trả lời một số câu hỏi:

  • Các DLL được viết bằng C++.
  • Các DLL bổ sung là QT-dlls.
  • Tôi muốn đặt các tệp DLL phụ trong cùng thư mục với plugin DLL của tôi. Tôi có thể lấy tên của thư mục đó từ GetModuleFileName.
  • Ứng dụng là Firefox, DLL là một mô-đun bảo mật PKCS # 11.
  • Ứng dụng tải tệp DLL bằng đường dẫn đầy đủ tới DLL (người dùng cung cấp nó khi cài đặt plugin).
  • Yêu cầu các tệp DLL được đặt trong System32 hoặc bên cạnh ứng dụng sẽ hoạt động, nhưng hơi lộn xộn một chút và có thể gây ra sự cố với trình gỡ cài đặt.
  • LoadLibraryGetProcAddress sẽ hoạt động, nhưng thực sự không khả thi trong trường hợp của tôi. Tôi đang sử dụng hàng trăm, nếu không phải hàng ngàn, phương pháp trong các DLL khác. Tôi thực sự cần phải sử dụng các thư viện nhập khẩu.

Tôi đã nghĩ đến việc sử dụng các tệp dll chậm trễ kết hợp với SetDllDirectory trong DllMain. Có ai đã thử bất cứ điều gì như thế này?

+1

Bạn đang sử dụng công nghệ nào? .mạng lưới? –

+0

Tiền đề của bạn không có ý nghĩa và bị hỏng. –

+0

Bạn luôn có thể đặt các dll trong thư mục System32 ... – Kryten

Trả lời

4

Tôi có thể nghĩ đến 3 cách.

  1. đặt dlls trong cùng thư mục với ứng dụng của bạn (bạn không thể làm điều này?)
  2. Use runtime liên kết. LoadLibrary()GetProcAddress()
  3. Sử dụng một biểu hiện http://msdn.microsoft.com/en-us/library/aa374182(VS.85).aspx

Nhưng nếu dll không có trong thư mục giống như .exe, làm thế nào thì bạn sẽ biết nó ở đâu? quên Windows không biết, làm cách nào để bạn biết?

+0

Nó không phải là ứng dụng 'của tôi', và tôi không thực sự thích cài đặt vào thư mục của các ứng dụng 'khác'. Các giải pháp thể hiện âm thanh thực sự thú vị - tôi sẽ xem xét điều đó. Bạn có bất kỳ tài liệu tham khảo thêm? –

1

bạn có thể chỉ định đường dẫn của dll làm thông số của LoadLibrary().

0

Một tùy chọn khác là sửa đổi biến PATH. Có một tập tin batch để khởi chạy ứng dụng chính, và thiết lập PATH =% PATH%;% ~ dp0. Điều này đảm bảo một dấu chân tối thiểu, không còn dấu vết nào trong hệ thống sau khi chạy.

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