2010-09-27 29 views
5

Tôi đang làm việc trên một dự án mà tôi sẽ tìm thấy một hệ thống plugin cơ bản hữu ích. Về cơ bản, tôi tạo lớp cơ sở và có thể cung cấp lớp cơ sở này cho một nhà phát triển plugin. Sau đó, nhà phát triển ghi đè và ghi đè các phương pháp. Sau đó, đây là nơi nó trở thành một chút không rõ ràng với tôi. Làm thế nào nó hoạt động từ đây? Tôi có thể tìm tài liệu liên quan đến sự phát triển của loại hệ thống này ở đâu?Hệ thống plugin hoạt động như thế nào?

Cảm ơn

Trả lời

7

Hệ thống plugin tôi biết tất cả sử dụng thư viện động. Về cơ bản, bạn cần xác định một cái bắt tay nhỏ, hiệu quả giữa kernel hệ thống và các plugin. Vì không có C++ ABI, các plugin phải chỉ sử dụng một API C hoặc sử dụng trình biên dịch rất giống nhau (và có thể là phiên bản trình biên dịch) làm hạt nhân của hệ thống. Giao thức đơn giản nhất có thể là một hàm, tất cả các nhà phát triển plugin sẽ phải cung cấp, nó trả về một cá thể của một lớp có nguồn gốc từ lớp cơ sở của bạn, được trả về như một con trỏ lớp cơ sở. (Các extern "C" đảm bảo rằng chức năng sẽ không có một cái tên đọc sai, và do đó dễ dàng hơn để tìm theo tên của nó.) Một cái gì đó như:

extern "C" { 
    plugin_base* get_plugin(); 
} 

Các hạt nhân sau đó sẽ cố gắng để tải tập tin nhị phân tìm thấy ở những nơi được chỉ định là năng động thư viện và cố gắng tìm hàm get_plugin(). Nếu nó thành công, nó sẽ gọi hàm này và kết thúc bằng một thể hiện plugin được nạp.

Tất nhiên, sẽ tốt hơn nếu bạn có chức năng kiểm tra phiên bản của API mà plugin được biên dịch so với phiên bản của hạt nhân. (Bạn có thể thay đổi lớp cơ sở đó, sau khi tất cả.) Và bạn có thể có các hàm khác, trả về thông tin về các plugin (hoặc bạn có này như là các virtual trong lớp cơ sở). Điều đó phụ thuộc rất nhiều vào bản chất của hệ thống của bạn.

+0

Nếu plugin_base không phải là POD nhưng đó là lớp thừa hưởng từ lớp plugin cơ sở, tôi nghĩ rằng toàn bộ việc cần làm một số loại C++ ABI (trình biên dịch bạn đã sử dụng) sẽ phải được sử dụng.: S –

+0

@Matteo: Vâng, bạn đã có một điểm rất hợp lệ ở đó. Cảm ơn. Tôi đã thích nghi câu trả lời của tôi cho phù hợp. – sbi

+1

Không sao cả. :) BTW, một thay thế trên Windows sẽ được sử dụng COM, mà thực sự có thể được nhìn thấy một phần như một C + + ABI tương thích với các ngôn ngữ khác. –

1

Bạn có thể biên dịch plugin dưới dạng thư viện động/chia sẻ vào thư mục plugin và sau đó từ mã của bạn tải động tất cả các tệp dll từ thư mục plugin.
Bạn có thể kiểm tra mã nguồn cho các chương trình như GIMP để kiểm tra cách chúng triển khai trình cắm.

1

Có thể hầu như tài liệu duy nhất bạn có thể tìm thấy sẽ là các hệ thống hiện có.

Về cơ bản, bạn có hai loại plugin phổ biến. Một xử lý những thứ như bản dịch đến/từ một số loại tập tin nước ngoài. Trong trường hợp này, bạn thường có khoảng ba chức năng: một để nhận dạng định dạng tệp, một để đọc và một để viết nó. Cùng với những thứ đó, bạn thường sẽ có một vài chuỗi để chỉ định phần mở rộng của tệp.

Một khả năng khác là việc xử lý bên trong chương trình của bạn. Trong trường hợp này, nó thường sẽ chỉ định một số mục được thêm vào cấu trúc trình đơn của bạn và một hàm được gọi cho mỗi cấu trúc. Trong hầu hết các trường hợp, bạn sẽ có ít nhất một chức năng khác để làm điều gì đó với việc tuần tự hóa cấu hình hiện tại của nó. Từ đó nó sẽ được vào bạn để quyết định làm thế nào để lộ đủ của internals của chương trình của bạn cho nó để có thể làm điều gì đó hữu ích.

2

Trên Linux, plugin là một thư viện được chia sẻ (có phần mở rộng là .so) cung cấp một hoặc nhiều hàm có tên trong API plugin của bạn. Chương trình của bạn mở thư viện với dlopen và nhận con trỏ đến các hàm sử dụng dlsym và gọi các hàm bằng cách sử dụng con trỏ. Plugin có thể gọi bất kỳ chức năng nào được xuất công khai từ chương trình của bạn.

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