Suy nghĩ đầu tiên của tôi là, nếu bạn liên kết tĩnh một dll, nó không phải là một plugin. Chỉ cần đặt dll trong thư mục EXE và được thực hiện với nó. Đó là cấu hình triển khai được hỗ trợ bởi các cửa sổ cho các DLL được tải tĩnh.
Điều đó nói rằng, có nhiều cách để đạt được những gì bạn muốn. Nhưng chúng chủ yếu là ngu ngốc, hoặc phức tạp không có lý do chính đáng: Các tùy chọn của bạn là:
- Không liên kết tĩnh. Sử dụng LoadLibrary ("plugins/Plugin.dll") & GetProcAddress để truy cập nội dung plugin.
- Thêm "đường dẫn tới thư mục plugin của bạn" vào biến môi trường PATH của hệ thống.
- Sử dụng cơ chế tải chậm trễ để trì hoãn việc truy cập chức năng bổ trợ, đặt custom helper function có thể tải (các) dll bằng cách sử dụng đường dẫn được cung cấp.
- Bật thư mục plugin thành một hội đồng (bằng cách tạo tệp .manifest trong đó liệt kê plugin.dll). Thêm "plugins" làm một hội đồng phụ thuộc vào ứng dụng của bạn. Bây giờ nó sẽ tìm trong thư mục plugins.
- Chia ứng dụng của bạn thành một exe sơ khai và phần được nạp động. Trong exe exe gọi SetDllDirectory để trỏ đến thư mục plugin, sau đó gọi LoadLibrary đi qua đường dẫn đầy đủ đến "appstub.dll".
Để bật một thư mục, với một hoặc nhiều của dll thành một "lắp ráp", chỉ cần thêm một tập tin vào thư mục với các thư mục name.manifest.
Vì vậy, plugins.manifest: -
<assembly manifestVersion="1.0">
<assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" />
<file name="Plugin.dll"/>
</assembly>
Đó là một ý tưởng rất tốt để đảm bảo rằng các thư mục và tên của dll là khác nhau, nếu như tên dll là cửa sổ tên lắp ráp bắt đầu nhìn vào nhúng nó tệp kê khai để biết thông tin về hội đồng.
Giả sử bạn đang sử dụng Visual Studio 7 trở lên, chỉ thị sau được thêm vào tệp .c/.cpp hoặc.h tập tin trong dự án sau đó sẽ làm cho nỗ lực ứng dụng của bạn để tải dlls từ lắp ráp chứ không phải chỉ là thư mục địa phương:
#pragma comment(linker, "/manifestdependency:\"name='Plugins' "\
"processorArchitecture='*' version='1.0.0.0' "\
"type='win32'\"")
Nguồn
2010-09-30 15:57:08
Cảm ơn - Tôi đã tiếp cận phương pháp GetProcAddress vì tôi không thể hiểu được cách biểu hiện giống như cách làm cho phương pháp "lắp ráp giả" hoạt động. May mắn thay, điều này hoạt động tốt với kiến trúc tổng thể. – Oliver
Bạn không cần 'SetDllDirectory' để tải trễ; có một móc '__pfnDliNotifyHook2' để bạn có thể gọi trực tiếp' LoadLibrary (". \\ plugins \\ PluginX.dll") '. Ý tưởng '% PATH%' hơi mỏng manh vì nó khá thấp trong danh sách các vị trí cần kiểm tra. – MSalters
cảm ơn. Tôi đã không bao giờ cá nhân sử dụng tải chậm trễ vì vậy tôi chỉ giả định rằng SetDllDirectory sẽ là cách để điều chỉnh nó. –