2015-04-25 2 views
-1

У меня есть Visual Studio проект под названиемЭкспорт визуальный проект студии C++ для использования в другом проекте, не раскрывая .cpp и .h исходные файлы

"TopSecretProject"

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

Пользователь должен получить:

  1. список имен функций, которые он может позвонить (в зависимости от прав, которые пользователь имеет), и пользователь должен иметь возможность разработать программу, используя эти функции как черные ящики ,
  2. Мой запечатанный TopSecretProject, который он не может открыть.

Возможно ли это в любом случае?

Я попробовал следующее решение, но не удалось:

  1. Экспорт TopSecretProject как статическая библиотека.
  2. Создание нового проекта VS для пользователя и добавление .lib к проекту пользователя.
  3. Копирование всех файлов .h в проект пользователя и создание предварительно скомпилированного файла заголовка.
  4. удаления заголовков (теперь, когда у меня есть .pch мне не нужно их больше)

Предварительно составленный заголовок будет восстановлен в любом счете и, таким образом, удаляя мой первый предварительно построил PCH ... Я также попытался скопировать pch непосредственно с TopSecretProject, но это не помогло.

Большое спасибо заранее!

+0

Если вы зададите этот вопрос, лучше написать _open source_ projects вместо _top secret_. – Lol4t0

+0

Я не понимаю вашего ответа. Вы можете объяснить? – Zorx

+0

Почему вы хотите скрыть код? Я не думаю, что это что-то важное. И если вы меняете свой код, люди его увидят и помогут улучшить его. – Lol4t0

ответ

0

Любые экспортированные объявления функций в предварительно скомпилированном заголовке, независимо от того, хотите ли вы, чтобы конечный пользователь мог их вызывать, могут быть легко извлечены из pch (или библиотеки, если на то пошло). Вы только вызываете головные боли, пытаясь доставить предварительно скомпилированный заголовок. :-)

Вместо этого, как насчет создания файла заголовка специально для конечных пользователей, где объявляются функции, которые вы хотите им получить? Ловушка заключается в том, что вам нужно создать файл заголовка для каждого набора разрешений (хотя это сложнее, чем указать доступные функции для каждого набора?)

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

Edit:

Что касается классов, если вы действительно не хотите, чтобы дать объявление класса, вы застряли реализации какой-то слой над классом для них, чтобы взаимодействовать с. Там не обойти это.Это, вероятно, означает один из двух путей:

Первый: вы можете объявить некоторые функции для создания, уничтожения и использования ваших классов и просто передать некоторые хорошие указатели ole 'void *. например

typedef void * MySecretClass; 

MySecretClass initializeMSC(...); 
void freeMSC(MySecretClass cls); 
int useMSC(MySecretClass cls, int param, ...); 

2: Вы можете создать класс-оболочку, который по существу делает то же самое.

class MySecretClassWrapper 
{ 
    public: 
     MySecretClassWrapper(void); 
     int useClass(int param); 

    private: 
     void * mySecretClassData; // <-- actual class instantiated here 
}; 

И скомпилированные определения:

MySecretClassWrapper::MySecretClassWrapper(void) { 
    mySecretClassData = reinterpret_cast<void *>(new MySecretClass); 
} 

int MySecretClassWrapper::useClass(int param) { 
    MySecretClass * object = reinterpret_cast<MySecretClass *>(mySecretClassData); 
    return object ? object->useClass(param) : -1; 
} 

Первый метод я использую при создании C++ классов, доступных для приложений C. Вторая - та же самая идея, но завершена в класс, который будет проще использовать для пользователей C++.

+0

. Вы уверены в правильности подготовки к компиляции головной боли. Спасибо за это! Я сделал то, что вы рекомендовали, и он отлично работает для функций, однако я не могу заставить его работать для классов, если только я не даю конечным пользователям полное определение класса (которое я не хочу давать). Любые предложения по этому поводу? – Zorx

+0

Он не будет работать непосредственно для классов. См. Мое редактирование. – Anthony

+0

Какой прекрасный ответ, спасибо. Итак, мой класс завернут, но как я могу обернуть реализацию некоторой функции в классе? функция внутри класса использует его поля и другие функции, а void * mySecretClassData не знает о них. Должен ли я также добавлять их в оболочку как void *? – Zorx