Экспорт класса из исполняемого файла в dll - PullRequest
3 голосов
/ 27 февраля 2009

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

Один из возможных способов сделать это - сделать все необходимые методы класса равными virtual (чтобы компоновщик DLL не нуждался в определениях этих методов). Недостатки этого подхода:

  1. Я не могу создавать объекты экспортируемых классов в коде DLL, используя new (необходимо создать дополнительные функции в исполняемый код).
  2. Я должен сделать все эти методы virtual, даже если в противном случае им не нужно быть virtual.

Существует способ экспортировать класс из DLL в исполняемый файл, используя расширенный атрибут класса хранения Microsoft __declspec(dllexport). Есть ли способ экспортировать класс из исполняемого файла в DLL, используя ту же технику?

Мой старый компилятор Borland C 6 не позволяет мне создавать библиотеку импорта во время сборки исполняемого проекта. (Таким образом, при компиляции DLL компоновщик выдает мне неразрешенные внешние сообщения об ошибках для всех импортированных методов не виртуального класса.) Это ограничение этого самого компилятора, или, может быть, я упускаю что-то важное?

Ответы [ 3 ]

3 голосов
/ 28 февраля 2009

Насколько я знаю, можно использовать dllexport MS VS для экспорта класса или функции из exe и использования их в DLL. и он работает здорово, если ваша DLL и Exe выполняют в одном процессе .

2 голосов
/ 27 февраля 2009

Вы можете поместить класс во вторую DLL, если вы действительно не хотите его в первой.

Мне трудно понять, почему вы не просто поместили класс в DLL.

ETA: Сделал еще несколько копаний и нашел эту ссылку , которая объясняет, как сгенерировать библиотеку импорта из проекта EXE в Visual Studio 2008. Что касается их экспорта, то это похоже, вы просто используете обычный __declspec (dllexport).

0 голосов
/ 28 февраля 2009

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

Шаг 1. Создайте API-оболочку C для вашего класса, вроде этого (возможно, не скомпилируется, но вы поняли):

// Yes, need some 32 bit/64 bit checks here
#define MYHANDLE unsigned int

__declspec(dllexport) MYHANDLE MyClassNewInstance() {
   MyClass* ptr = new MyClass();
   return (MYHANDLE)ptr;
}

__delspec(dllexport) MyClassDoSomething( MYHANDLE handle, int parm ) {
  MyClass* ptr = (MyClass*)handle;
  ptr->DoSomething(parm);
}

etc..

Шаг 2. Чтобы получить функции C из EXE-файла для использования в DLL, используйте функции Win32 API GetModuleHandle () и GetProcAddress ().

Шаг 3: Создайте прокси-класс в вашей DLL. Методы в прокси-классе ничего не делают, кроме как вызывают их аналогичные функции C из EXE.

Это позволит сохранить "настоящую" реализацию вашего класса от DLL. Это взлом, но это, вероятно, сработает.

...