Не было бы легче использовать аутентификацию с открытым ключом и использовать ключ без пароля?
Как пользователь на исходной машине делают это, чтобы сделать ключ RSA
ssh-keygen -t rsa
Теперь копия ~/.ssh/id_rsa.pub к целевой машине и добавить его в authorized_keys файл целевого пользователя
Отвечая на ваш вопрос строго, вам нужно добавить функцию extern «C», которая возвращает результат конструктора:
extern "C" foo* __declspec(dllexport) new_foo(int x) {
return new foo(x);
}
Затем в вашем источнике вы можете использовать GetProcAddr для «new_foo» для вызова функция.
Вам необходимо объявить свой класс с помощью ключевого слова __ 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 ()).
Вам нужно будет экспортировать функцию из библиотеки DLL, которая вызывает конструктор и возвращает новый объект.
Старайтесь избегать использования конкретных типов C ++ в качестве параметров функции; идея DLL заключается в том, что вы можете независимо обновлять их, но обновленный компилятор может размещать std :: string по-другому, вызывая несовместимость во время выполнения.
Это то, что лежит в основе COM, например - система ограниченного типа и стандартная экспортируемая функция для получения экземпляров объектов.
Вместо того, чтобы экспортировать каждый метод класса с помощью __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();
}