1) Nếu INTERFACE được cung cấp bởi DLL thực sự là giao diện C++, thì có, nó làm cho nó khó (nếu không phải là không thể) đối với các ngôn ngữ khác để giao tiếp với DLL.C++ là phức tạp hơn để giao tiếp với hơn C, vì cấu trúc phức tạp hơn của lớp (this
con trỏ được truyền cùng, con trỏ hàm ảo/bố cục VTABLE) và xử lý ngoại lệ (trong đó mã được gọi là để xử lý thực tế là ngoại lệ xảy ra theo cách nào đó, và để làm điều đó, mã cần có khả năng "bung" cuộc gọi ngăn xếp mã đã ném ngoại lệ và phá hủy bất kỳ đối tượng nào được tạo trên đường cho đến khi tìm thấy catch
- nếu không trong thư viện DLL, bạn sẽ gặp vấn đề - việc giải nén này không phải là một phần của tiêu chuẩn C++, vì tiêu chuẩn không muốn giới hạn kiến trúc nào và các tính năng cần xử lý/cần phải thực hiện C++ nhiều hơn mức cần thiết). Bắt ngoại lệ trong DLL sẽ giải quyết vấn đề ở đây.
Nói cách khác, nếu ngôn ngữ không phải là C++ [và có thể từ cùng một nhà cung cấp] đang gọi mã, thì cần phải xử lý C++ cho bất kỳ ngôn ngữ nào đang gọi nó. Điều này có thể khá phức tạp.
Bất kỳ đối tượng C++ nào cũng cần được dịch từ/sang ngôn ngữ có liên quan trong mã gọi. Đối với các loại cơ bản chung với C, điều này thường không phải là một vấn đề, nhưng các lớp, cấu trúc, vv, sẽ phải được so khớp với một cái gì đó tương thích trong ngôn ngữ địa phương.
Mặt khác: Chức năng C rất dễ giao tiếp với: đặt đối số trên ngăn xếp, gọi hàm và dọn sạch đối số khi trả về. Không có gì lạ xảy ra, không có thông số chức năng ẩn, không cần thư giãn ngăn xếp. Biến chứng nhẹ duy nhất là các hàm trả về struct
(lớn hơn một kích thước nhất định) - nhưng đó là một trường hợp khá đặc biệt trong "objets" của C. C đơn giản hơn nhiều, và hầu hết các ngôn ngữ đều có loại tương ứng tốt với các loại ngôn ngữ C cơ bản (nhưng kiểu C struct
vẫn có thể gây ra một số vấn đề thú vị, và union
có thể là một thách thức thực sự nếu nó được sử dụng "khéo léo").
2) Chọn ngôn ngữ là một doanh nghiệp phức tạp, và phần lớn phụ thuộc vào cách DLL được sử dụng hoặc loại giao diện mà nó được cho là cung cấp, và giao diện nào sẽ kết nối với - nếu DLL của bạn giao tiếp với một DLL C++ khác (hoặc một số mã C++ khác), sau đó bạn có thể muốn sử dụng C++. Nhưng có nhiều cách để tạo ra một C++ DLL có giao diện C, bằng cách sử dụng extern "C"
cho các chức năng giao diện (và đảm bảo rằng không có gì throws
trên tường đến "C", bởi vì điều đó chắc chắn sẽ gây ra vấn đề).
Kết luận: Rõ ràng, bằng cách hạn chế các giao diện để "chỉ sử dụng C++", sau đó là một biến chứng hơn nữa trong bất cứ ai rằng việc sử dụng thư viện từ, nói, C, Python hay Lisp [tất cả trong số đó có lẽ có thể gọi Các hàm C khá dễ dàng], người dùng đó sẽ phải bọc mã C++ trong trình bao bọc ngôn ngữ C. Và có, điều này có thể được thực hiện, và được sử dụng khá thường xuyên khi một số thư viện thực sự tốt có sẵn trong C++, rằng ai đó muốn kết nối với một ngôn ngữ có giao diện kiểu C có sẵn. Đó là khá nhiều giải pháp tương tự như "cung cấp một giao diện C đến C + + trong DLL", ngoại trừ nó không được cung cấp bởi nhà sản xuất của DLL.
Thư viện OneJoker của tôi được viết bằng C và có thể gọi từ C, C++, Java và Python trên Linux và Windows. Điều này là hợp lý đơn giản, bởi vì JNI của Java và mô-đun ctypes của Python đều được thiết kế để làm việc với C, chứ không phải C++. C++ kéo trong rất nhiều phụ thuộc, mangles các tên hàm bên ngoài, v.v. Chỉ là kinh nghiệm của tôi. –
Khá chắc chắn bạn có thể 'extern" C "' nếu bạn cần xuất một giao diện C. Liên quan đến câu hỏi thứ hai, bạn muốn xem các đối tượng COM (bất cứ thứ gì có thể sử dụng chúng và đó là điểm). –