2016-10-06 13 views
2

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

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

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

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

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

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

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

ответ

2

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

Для получения более подробной информации, пожалуйста, обратитесь к pimpl idiom.

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

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

+0

Это не относится к вопросу DLL вообще. –

+0

Прочтите. Таким образом, это в основном опирается на прямое объявление тела реализации, включая переменные, которые я хотел бы скрыть, и чья декларация 1. отложена на более поздний этап процесса компиляции, пока это еще не все еще вызывает ошибку, и 2. в другом файле, который не используется совместно с клиентом. Если у моего клиента тогда есть только H-файл без объявления тела реализации, а моя DLL с объявлением (и определением) его внутри, сможет ли он скомпилироваться? – Charles

+0

@ Moo-Juice Вот что я боюсь. Опять же, и если у кого-то есть лучшее предложение, у моего клиента будет только DLL и H-файл, объявляющий экспортируемый материал, который ему нужен. – Charles

4

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

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

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

+0

На самом деле мы уже это сделали, так как мы действительно сталкивались с проблемами из-за различных шаблонов смены имени на разных компиляторах. Это было исправлено не позднее, чем вчера, поскольку я знаю, что компилировать в Visual Studio Express 2015, как и мой клиент. Мы еще не пытались вернуться к интерфейсу C++. И если я действительно ограничиваю себя интерфейсом C и ставил все мои объекты в качестве статических переменных в исходном файле, тогда мы в порядке. Но теперь, когда мы думаем, что мы можем использовать C++, вопрос возникает снова. – Charles

+0

@Charles: речь идет не только о различиях в определении имен, но и о более глубоких проблемах, например. различные _implementations_ структур данных STL между различными версиями Visual Studio. Вам не нужны статические переменные. Вы можете просто обернуть метод класса C++ в функциях C (например, 'MyClass' ctor становится' MyClass_Create() ',' MyClass :: DoX() 'становится' MyClass_DoX() 'и т. Д.) И передать указатель' this' как непрозрачный указатель. –

+0

Итак, вы ясно говорите мне, чтобы просто прибегнуть к списку методов C, которые в фоновом режиме относятся к некоторым материалам на C++. Итак, в основном то, что мы имеем сейчас, что очень похоже на то, что вы описали. – Charles