2008-09-04 32 views
44

Các hệ thống trình cắm trong C++ rất khó vì ABI không được xác định đúng và mỗi trình biên dịch (hoặc phiên bản của nó) tuân theo các quy tắc riêng của nó. Tuy nhiên, COM trên Windows cho thấy rằng nó có thể tạo ra một hệ thống plug-in tối thiểu cho phép các lập trình viên với các trình biên dịch khác nhau tạo ra các trình cắm thêm cho một ứng dụng máy chủ lưu trữ bằng cách sử dụng một giao diện đơn giản.Có gì an toàn cho hệ thống plug-in C++?

Hãy thực tế và để nguyên tiêu chuẩn C++, điều này không hữu ích trong khía cạnh này, ngoài một phút. Nếu tôi muốn viết một ứng dụng cho Windows và Mac (và tùy chọn Linux) hỗ trợ các trình cắm thêm C++ và nếu tôi muốn cung cấp cho các tác giả trình cắm thêm một lựa chọn hợp lý các trình biên dịch (nói các phiên bản cũ hơn 2 năm của Visual C++ , GCC hoặc trình biên dịch C++ của Intel), tôi có thể dựa vào tính năng nào của C++?

Tất nhiên, tôi giả định rằng các trình cắm thêm sẽ được viết cho một nền tảng cụ thể.

Off đỉnh đầu của tôi, đây là một số C++ tính năng mà tôi có thể nghĩ đến, với những gì tôi nghĩ là câu trả lời:

  • vtable bố trí, sử dụng đối tượng thông qua các lớp trừu tượng? (có)
  • loại có sẵn, con trỏ? (có)
  • cấu trúc, công đoàn? (có)
  • ngoại lệ? (no)
  • chức năng "C" bên ngoài? (có)
  • chức năng "C" không ngoại lệ với các loại tham số được cài sẵn? (có)
  • các chức năng "C" không có ngoại lệ với các loại thông số do người dùng xác định? (không)

Tôi sẽ đánh giá cao bất kỳ trải nghiệm nào bạn có trong khu vực mà bạn có thể chia sẻ. Nếu bạn biết về bất kỳ ứng dụng thành công nào có hệ thống plug-in C++ thì điều đó cũng rất tuyệt.

Journal Carl

Trả lời

25

Tiến sĩ Dobb của có một bài báo Building Your Own Plugin Framework: Part 1 đó là đọc khá tốt về đề tài này. Nó là sự khởi đầu của một loạt các bài viết bao gồm kiến ​​trúc, phát triển và triển khai khung công tác đa nền tảng C/C++.

+3

Câu trả lời này sẽ tốt hơn nếu bạn tạo liên kết "Ở đây" mô tả chi tiết hơn một chút. Ngay bây giờ, bạn không thể nói với những gì bạn đang liên kết. –

+1

Cảm ơn lời khuyên!Điểm lấy – Serge

1

Tôi có công cụ trò chơi của riêng mình có hệ thống plug-in C++.

Tôi có một số mã trong tệp tiêu đề để tệp được đưa vào đơn vị biên dịch của plugin.

Các chức năng lớn hơn sống trong động cơ chính được gọi thông qua chức năng C được xuất (plugin gọi MyObject_somefunction (MyObject * obj) trong động cơ chỉ gọi obj-> somefunction()). Nếu gọi một hàm C là xấu xí cho khẩu vị của bạn, sau đó với một số thủ đoạn gian trá header, khi tiêu đề được bao gồm trong các plugin, có chức năng thành viên #defined để gọi C chức năng:

#if defined(IN_THE_PLUGIN) 
void MyObject::somefunction() { MyObject_somefunction(this); } 
#endif 

chức năng ảo hoặc phải tinh khiết hoặc mã sống trong tệp tiêu đề. Nếu tôi không kế thừa từ một lớp và chỉ đơn thuần là instancing một, mã chức năng ảo có thể sống trong động cơ, nhưng sau đó lớp phải xuất một số chức năng C để tạo và phá hủy đối tượng được gọi từ plugin.

Về cơ bản, các thủ thuật mà tôi đã sử dụng, với mục tiêu là duy trì nền tảng độc lập hoàn toàn, chỉ cần tính cho xuất khẩu C và thủ thuật tệp tiêu đề.

6

Bạn cũng có thể xem xét thay thế giao diện plugin thông thường bằng giao diện tập lệnh. Có một số ràng buộc rất tốt cho một số ngôn ngữ kịch bản trong C/C++ đã giải quyết được vấn đề của bạn. Nó có thể không phải là một ý tưởng tồi để xây dựng trên đầu trang của họ. Ví dụ: hãy xem Boost.Python.

+0

Nếu bạn đang đi cho rằng, tôi muốn nói Lua là một phù hợp hơn nhiều, vì nó dễ dàng hơn nhiều để tích hợp với C + + và nó nhẹ hơn nhiều. –

+1

Điều đó nói rằng, có một số lần mà kịch bản đơn giản là không đủ - đặc biệt là nếu bạn muốn cho phép các plugin có quyền truy cập vào hệ điều hành. –

3

Tôi nghĩ rằng bạn được an toàn tạo ra một hệ thống plugin dựa trên:

  • Bao bì các chức năng cắm vào thư viện (.dll, .so, vv)
  • Yêu cầu rằng các plugin lộ C-ngôn ngữ chính xuất khẩu.
  • Yêu cầu plugin triển khai (và trả về con trỏ/tham chiếu đến) một giao diện C++ trừu tượng.

Có lẽ hệ thống plugin C++ thành công nhất: tốt cũ Adobe Photoshop. Và nếu không phải vậy, một trong các định dạng tổng hợp ảo như VSTi, v.v.

3

Cuốn sách Imperfect C++ by Matthew Wilson có thông tin tốt về điều này.

Lời khuyên có vẻ là: miễn là bạn sử dụng cùng trình biên dịch (hoặc tương đương), bạn có thể sử dụng C++, nếu không bạn sử dụng C làm giao diện trên đầu mã C++ của bạn.

+0

Cảm ơn lời khuyên - Tôi đã đi qua tiêu đề đó rất nhiều lần mà tôi đã đi trước và mua nó lần này. –

5

Qt có hệ thống rất tốt cho các plugin mà tôi đã sử dụng trong quá khứ. Nó sử dụng hệ thống siêu đối tượng của Qt để khắc phục nhiều vấn đề thường gặp khi cố gắng phát triển các plugin C++.

Một ví dụ là cách hoạt động của Q_DECLARE_INTERFACE để ngăn bạn sử dụng plugin không tương thích. Một cái khác là build key, để đảm bảo bạn tải đúng plugin cho kiến ​​trúc, hệ điều hành, trình biên dịch của bạn. Nếu bạn không sử dụng hệ thống plugin của Qt, đây là những thứ bạn sẽ phải lo lắng và tự mình phát minh ra các giải pháp. Nó không nhất thiết phải khoa học tên lửa, và tôi không nói rằng bạn sẽ thất bại ở đó, nhưng những người ở Trolltech khá thông minh và đã dành một thời gian suy nghĩ về nó, và tôi muốn sử dụng những gì họ tạo ra hơn là tự tái tạo bánh xe .

Ví dụ khác là RTTI thường không hoạt động trên ranh giới DLL, nhưng khi sử dụng Qt, những thứ như qobject_cast dựa vào hệ thống meta-object làm việc trên các ranh giới DLL.

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