Совместное использование C ++ DLL и H-файла с клиентом

Сначала в своей профессиональной жизни я должен доставить клиенту DLL, которая содержит наше базовое, универсальное программное обеспечение и интерфейс, который заставляет его работать так, как этого хочет клиент +, позволяет клиенту вводить входные данные и читать выходные данные.

Теперь моя большая проблема заключается в том, что я могу не показать своему клиенту ничего, что ему абсолютно не нужно знать из-за интеллектуальной собственности. Это включает типы данных, поэтому я даже не могу показать ему сигнатуру любого из наших внутренних методов. Я создал типы данных и структуры, которые имитируют наши собственные внутренние, но которые, например, добровольно пропускают ненужные атрибуты / элементы или дают им разные имена, чтобы скрыть подсказки к нашей частной внутренней логике. И затем методы, которые получают данные, отображают наши собственные структуры данных и вводят их. Вы получаете картину.

Кроме того, на этот раз с точки зрения чисто архитектуры программного обеспечения я не хочу, чтобы он имел доступ к определенным элементам, атрибутам, переменным … потому что мне не нужно, чтобы он знал, что они существуют, или не хочу, чтобы он изменял их, когда он радует и как ему нравится. Тем не менее, они связаны исключительно с этим интерфейсом и совсем не являются частью нашего внутреннего программного обеспечения.

Сейчас у меня есть класс, который служит интерфейсом, который он может создавать. Он в основном предоставляет методы получения для вывода, методы для подачи вычислений ввода и запуска обновлений, а также методы получения и установки для других параметров и значений (например, версий программного обеспечения или текущего состояния). Фактические переменные данных для этих параметров и других переменных скрыты в моем файле CPP, который скомпилирован в DLL, поэтому они даже не объявляются как атрибуты класса, который мы используем в качестве интерфейса в файле H, который я ему даю, даже не как частный, и он не знает о них — у него есть только добытчики и сеттеры.

Какой шаблон дизайна я должен использовать здесь? Могу ли я на самом деле поместить свои переменные в H-файл, которым я делюсь с клиентом, как атрибуты класса, как частные? Но тогда, сможет ли он изменить их с закрытого на общедоступный, написав новые методы для класса, получая к ним доступ и изменяя их свободно без жалоб компилятора? Могу ли я в противном случае внести свой вклад в мой класс и расширить его в моем файле CPP или в другом файле H, к которому у него не будет доступа?

Так много вопросов, так как все это для меня ново. Но вы получите общую картину: я хочу поделиться с моим клиентом строго необходимой, предельно минимальной информацией в этом H-файле, чтобы он мог заставить мою DLL работать и получать свои выходные данные. И не более.

Заранее спасибо,
Чарльз

2

Решение

Во-первых, вы должны рассмотреть возможность создания DLL с чистым интерфейсом C, так как наличие интерфейса C ++ с классами STL на границах DLL является высоко ограничение (например, ваш клиент должен использовать так же Версия компилятора Visual C ++ и динамическая ссылка на тот же вариант CRT, который вы использовали для создания DLL).

На этом этапе вы можете разработать тонкий слой, который будет скрывать / скрывать вашу реализацию C ++ (скомпилированную в DLL и, как таковую, доставленную в двоичном виде) клиенту.

Вы также можете предоставить простой общедоступный заголовочный файл, который может обернуть слой интерфейса C, предоставляемый DLL, хорошим объектно-ориентированным способом C ++ (вроде как ATL и WTL для функций Win32 pure-C API).

4

Другие решения

Какой шаблон дизайна я должен использовать здесь?

Пожалуйста, обратитесь к идиома Больше подробностей.

Могу ли я на самом деле поместить свои переменные в H-файл, которым я делюсь с клиентом, как атрибуты класса, как частные? Но тогда, сможет ли он изменить их с закрытого на общедоступный, написав новые методы для класса, получая к ним доступ и изменяя их свободно без жалоб компилятора?

Да, он будет. С pimpl это все еще возможно, но гораздо сложнее и требует реверс-инжиниринга.

2