Как создать некоторый класс из dll (конструктор в dll) в C++?

Не было бы легче использовать аутентификацию с открытым ключом и использовать ключ без пароля?

Как пользователь на исходной машине делают это, чтобы сделать ключ RSA

ssh-keygen -t rsa

Теперь копия ~/.ssh/id_rsa.pub к целевой машине и добавить его в authorized_keys файл целевого пользователя

8
задан Cœur 8 December 2018 в 16:49
поделиться

4 ответа

Отвечая на ваш вопрос строго, вам нужно добавить функцию extern «C», которая возвращает результат конструктора:

extern "C" foo* __declspec(dllexport) new_foo(int x) {
    return new foo(x);
}

Затем в вашем источнике вы можете использовать GetProcAddr для «new_foo» для вызова функция.

3
ответ дан 5 December 2019 в 08:53
поделиться

Вам необходимо объявить свой класс с помощью ключевого слова __ declspec (dllexport) при построении библиотеки DLL. При использовании DLL класс необходимо объявить с помощью __ declspec (dllimport) :

#ifdef COMPILING_DLL
#define DECLSPEC_CLASS __declspec(dllexport)
#else
#define DECLSPEC_CLASS __declspec(dllimport)
#endif

class DECLSPEC_CLASS MyClass
{
...
}

Когда DLL скомпилирована, вы должны добавить -DCOMPILING_DLL в список определений.

При использовании класса , вы должны статически связать с DLL, то есть передать библиотеку импорта mydll.lib в основную программу.

Если вы хотите загрузить DLL во время выполнения , вам необходимо иметь C-функцию в DLL, которая создает объект и возвращает его вам. Невозможно динамически искать конструктор в DLL (с ​​помощью GetProcAddress ()).

10
ответ дан 5 December 2019 в 08:53
поделиться

Вам нужно будет экспортировать функцию из библиотеки DLL, которая вызывает конструктор и возвращает новый объект.

Старайтесь избегать использования конкретных типов C ++ в качестве параметров функции; идея DLL заключается в том, что вы можете независимо обновлять их, но обновленный компилятор может размещать std :: string по-другому, вызывая несовместимость во время выполнения.

Это то, что лежит в основе COM, например - система ограниченного типа и стандартная экспортируемая функция для получения экземпляров объектов.

3
ответ дан 5 December 2019 в 08:53
поделиться

Вместо того, чтобы экспортировать каждый метод класса с помощью __declspec, вы также можете полагаться на тот факт, что компилятор может вызывать виртуальные функции через vtable, например:

//note: no __declspec
class IPublicInterface
{
  virtual ~IPublicInterface() = 0;
  virtual void SomeMethod() = 0;
};

//note: no __declspec
class SomeClass : IPublicInterface
{
  virtual ~SomeClass() { ... }
  virtual void SomeMethod() { ... }
};

//note: this is the only method which needs to be exported from the DLL
IPublicInterface* createSomeClass()
{
  return new SomeClass();
}
3
ответ дан 5 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: